我正在尝试清理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遇到“在实际单元格值中,它会将其分隔为”“,这将导致下面的正则表达式出现问题,其他人是否有解决方案?”
答案 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);