删除内容换行符tsv

时间:2014-06-12 04:37:40

标签: php regex excel tsv

我正在尝试清理TSV文件(从Excel电子表格复制)以便读取到PHP。

我需要做的是从TSV的内容部分删除任何换行符,但不删除每行末尾的换行符,任何想法如何通过使用正则表达式或其他函数来实现。

示例数据(我突出显示了标签):

[tab]Some tab seperated data[tab]"
Here is some text that someone has used alt+enter to insert a new line into
• One.
• Two
• Three
"[tab][tab][tab][tab]Some data[tab][tab]Some other data[final-line-break]

编辑:进一步调查后,如果excel遇到“在实际单元格值中,它会将其分隔为”“,这将导致下面的正则表达式出现问题,其他人是否有解决方案?”

2 个答案:

答案 0 :(得分:0)

主要困难是将开盘报价区分为收盘价。

你可以使用这个替换(我已经把#作为替换字符串只是为了看,你显然可以使用你想要的东西,空格,空字符串......)

$pattern = <<<'EOD'
~
(?:            # entry points:
    (?!\A)\G   #   - contiguous to a precedent match
  |            #   OR
    (?:^|\t)"  #"# - quote preceded by a start of line or a tab 
)

(?>
    [^\r\n"\t]+ #"# all execpt tabs, newlines and quotes
  |
    ""          # escaped quote
)*
\K              # remove all on the left from match result
(?:
    \R          # newline
  |
    "(*SKIP)(?!) #"# closing quote (skipped)
)
~xm
EOD;

$data = preg_replace($pattern, '#', $data);

匹配只能从两个入口点之一开始。第一个匹配使用开头引用,下一个使用(?!\A)\G入口点。 \G是先前匹配结束的锚点,但由于它也可以匹配字符串的开头,我添加了(?!\A),这意味着后面没有字符串的开头避免这种可能性。

\K从匹配结果中删除之前匹配的所有内容。有了这个技巧,左边的任何东西都不会被替换。

无论操作系统如何,

\R代表换行符(不过,我认为你的情况可能是\r\n。)

"将与结束报价相匹配。但由于你不想替换它,我强迫模式失败,(?!) (后面没有任何东西)

(*SKIP)回溯控制动词禁止在失败的情况下重试之前匹配的字符。这非常有用,因为没有它,结束引用可以被看作下一次迭代模式的新开头引用。有了这个,正则表达式引擎将继续搜索结束报价。

答案 1 :(得分:0)

我对问题的解决方案:

/\n(.+\n[^\t])+.+/

使用上面的模式,您可以在您提到的引号之间准确地获取字符串。

从这里你可以使用preg match和模式来获取引号之间的字符串。然后使用pre_replace根据需要替换新行。

preg_replace(“/ \ n /”,“”,$ match);