我有一个 CSV 文件,我需要先清理一下,然后再将其读入表格。它是一个用管道分隔的 10 列结构。难点在于,在某些记录中,第 9 列有回车符。我需要用一串符号(作为占位符)替换这些 CRLF 实例,例如 #$%,但我只需要替换在第 9 列中,对于每条记录。
因此在这个例子中:
Susan|Ward |1 |1 |1 |1 |0 |||3250905
Allen|Doe|4 |1 |1 |1 |0 ||
some text
text
more text in the same column|3250061
Mary|James|4 |1 |1 |1 |0 |||3250061 Albert|Nordling|1 |1 |1 |0 |0 |||900434
Henry|Johnson|1 |1 |1 |0 |0 |||900434
Tony|Anderson |1 |1 |1 |1 |0 |||3250905
Susan、Henry 和 Tony 的记录都有 9 个管道,但 Allen 的记录有 CRLF 实例(在 Notepad++ 中),需要将其替换以将它们全部“拉”到同一行,以使该记录全部在一行上。
此外,Mary 和 Albert 的记录都在同一行。我需要能够找到它们,以便将它们分开。
因此,使用正则表达式来查找不包含 9 个竖线的行即可解决问题。
我可以使用以下正则表达式在多行上找到第 9 列的记录:
^[^|]*$
但我不知道如何找到全部行不要有 9 个管道 (10 列)。这行不通:
^[^|{9}]*$
什么会造成这种情况?
一个具体点:如果可能的话,我需要能够让搜索选择没有 9 个竖线的整块行(即每条记录)。因此,在我的示例中,以 Allen 开头的行,在 Notepad++ 中进行搜索将突出显示该行和接下来的 3 行。正则表达式^[^|]*$
将选择 Allen 行之后的所有三行,因为它正在寻找完全没有竖线的行。
答案1
你可以使用这个表达式来匹配恰好有 10 列的行:
^([^|\n]*\|){9}[^|\n]*$
你可以测试一下这里
在哪里:
^ ... $
匹配行首和行末[^|\n]*
匹配列的内容(没有 | 也没有换行符;甚至可以为空)\|
匹配管道符(需要转义
匹配少于九列的行:
^([^|\n]*\|){0,8}[^|\n]*$
匹配少于九列的行:
^([^|\n]*\|){10,1000}[^|\n]*$
更新
尝试了一下,似乎可以找到不完全是 10 列 (9 |
) 的行:
(^([^|\r\n]*\|){0,8}[^|\r\n]*$)|(^([^|\r\n]*\|){10,1000}[^|\r\n]*$)
测试一下这里