2

我有一个包含大约 600 条记录的 CSV 文件,我需要用 [空格] 替换一些 [CRLF] 但只有当 [CRLF] 位于两个 ["] (引号)之间时。当第二个 ["]遇到然后它应该跳过该行的其余部分并转到文本中的下一行。

我真的没有起点。希望有人提出建议。

例子:

John und Carol,,Smith,,,J.S.,,,,,,,,,,,,,+11 22 333 4444,,,,,"streetx 21[CRLF]
New York City[CRLF]
USA",streetx 21,,,,New York City,,,USA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Normal,,My Contacts,[CRLF]

在这种情况下,第一个 ["] 之后的两个 [CRLF] 需要用空格 [ ] 替换。当遇到第二个 ["] 时,跳过行尾并转到下一行。

再说一次,现在在下一行,在遇到第一个 ["] 之后替换所有 [CRLF] 直到遇到第二个 ["]。[CRLF] 的数量各不相同。在 CSV 文件中,逗号 [,] 在 (23) 之前和 (65) 之后的数量,两个引号 ["] 是恒定的。

所以也许可以使用逗号计数器。我不知道。

感谢您的反馈。

4

3 回答 3

6

这将只使用一个正则表达式(在 Notepad++ 中测试):

在字段中输入此正则表达式Find what

((?:^|\r\n)[^"]*+"[^\r\n"]*+)\r\n([^"]*+")

Replace with字段中输入此字符串:

$1 $2

确保Wrap around选中复选框(和Regular expression单选按钮)。

根据需要执行Replace All多次(直到弹出“0 次出现”对话框)。

解释:

(
  (?:^|\r\n)     Begin at start of file or before the CRLF before the start of a record
  [^"]*+         Consume all chars up to the opening "
  "              Consume the opening "
  [^\r\n"]*+     Consume all chars up to either the first CRLF or the closing "
)                Save as capturing group 1 (= everything in record before the target CRLF)
\r\n             Consume the target CRLF without capturing it
(
  [^"]*+         Consume all chars up to the closing "
  "              Consume the closing "
)                Save as capturing group 2 (= the rest of the string after the target CRLF)

注意:*+ 是所有格量词。适当地使用它们来加快执行速度。

更新:

这个更通用的正则表达式版本适用于任何换行序列(\r\n,\r\n):

((?:^|[\r\n]+)[^"]*+"[^\r\n"]*+)[\r\n]+([^"]*+")

于 2013-01-24T06:27:13.277 回答
1

在这种情况下,源数据是由 GMail 中的导出功能为您的联系人生成的。在下面概述的修改之后(没有 RegEx),结果可用于整理您的联系人数据库并将其重新导入 GMail 或 MS Outlook。是的,我站在@alan 和@robinCTS 的肩膀上。谢谢你俩。

5个步骤的说明:

使用 Notepad++ / 查找替换 / 扩展搜索模式 / 环绕 = on

-1- 将所有 [CRLF] 替换为唯一的字符集或字符串(我使用 [ ~~])

查找:\r\n 并替换为:~~ 文件内容现在仅在一行上。

-2- 现在我们需要分隔标题行。对于这个移动到第一个记录正好在第 88 个之前开始的位置。逗号(包括第 87 个后的单词。逗号 [,])并通过按回车键手动输入 [CRLF]。现在有两行:标题和记录。

-3- 现在找到所有 [ ,~~] 并替换为 [ ,\r\n] 结果是每行一条记录。

-4- 删除剩余的 [~~] find:~~ 并替换为: [ ] 一个空格。该文件现在已清除不需要的 [CRLF]。

-5- 保存文件并按预期使用。

于 2013-01-25T00:35:32.087 回答
0

也许分三步完成(假设您在 CSV 中有 88 个字段,因为您说之前有 23 个逗号,每秒有 65 个逗号"

第 1 步:用文件中没有的某个字符替换所有 CR/LF,例如~

搜索:\r\n替换:~

第 2 步:将所有~第 88 个“逗号组”(或 CSV 中的许多字段)替换为\r\n-- 以重新插入所需的 CSV 换行符:

搜索:((?:[^,]*?,){88})~替换:$1\r\n

第3步~:用空格替换所有剩余的

搜索~ 替换:<space>

于 2013-01-24T05:13:48.943 回答