我需要组合以相同ID开头的多行

时间:2017-10-25 21:15:28

标签: regex database csv parsing

我在文本文件中有多行,我需要将它们组合在一起。该文件大约有2亿行,因此使用Excel打开它并使用它们的内置工具是不可能的。

第一组线条如下所示:

1,example@gmail.com,Username
3,example@gmail.com,Username
4,example@gmail.com,Username
5,example@gmail.com,Username
9,example@gmail.com,Username
10,example@gmail.com,Username

我要在第一组的最后一行添加的第二组是:

1,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
3,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
4,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
5,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
9,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
10,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q

如果有人有这方面的经验,我会爱上一些帮助

1 个答案:

答案 0 :(得分:0)

代码

正则表达式

^(\d+),(.*$)(?=[\s\S]*^\1,(.*))

格式化输出

$1,$2,$3

结果

输入

1,example@gmail.com,Username
3,example@gmail.com,Username
4,example@gmail.com,Username
5,example@gmail.com,Username
9,example@gmail.com,Username
10,example@gmail.com,Username
1,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
3,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
4,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
5,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
9,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
10,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q

输出

1,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
3,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
4,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
5,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
9,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q
10,example@gmail.com,Username,$2a$10$gdsZkf62vUfwHQX8pUGe2.7zqvBvcIPWseaJmboJw3U2sxDj18y5q

说明

  • ^在行首处断言位置
  • (\d+)将一个或多个数字捕获到捕获组1
  • ,字面匹配逗号字符,
  • (.*$)捕获任意数量的任何字符(换行符除外),直到行尾的断言位置(断言行尾位置显着减少步骤)进入捕获组2
  • (?=[\s\S]*^\1,(.*))肯定前瞻断言后续匹配
    • [\s\S]*匹配任意数量的任何字符(\s:任何空白字符; \S:任何非空白字符)
    • ^在行首处断言位置
    • \1匹配与第一个捕获组最近匹配的文本相同的文本
    • ,字面匹配逗号字符,
    • (.*)将任意数量的任何角色捕获到捕获组3