【问题标题】:I need to combine multiple lines starting with the same ID我需要合并以相同 ID 开头的多行
【发布时间】:2017-10-25 21:15:27
【问题描述】:

我需要将文本文件中的多行合并在一起。该文件大约有 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

如果有人有这方面的经验,我很想得到一些帮助

【问题讨论】:

  • 看数据,这个程序的意图是什么?在我看来,您有一个包含电子邮件、用户名和散列密码的 CSV。在正常环境下,究竟谁会需要这样做?东西看起来很可疑????对我来说。
  • 我需要为一个客户端恢复一个数据库备份,而且备份的方式很奇怪。我可以做到这一点的一种方法是制作一个正则表达式来识别 bcrypt 哈希,在前面添加逗号并使用 sql 来组合具有相同 ID 的行,但这确实效率低下,所以我在这里问
  • 你的这个客户有2亿用户?
  • 他们为许多大客户进行安全评估,但大部分都是重复的,这是我以后必须处理的另一个问题
  • 你明白我的犹豫...这两组 CSV 数据是否在同一个文件中?

标签: regex database csv parsing


【解决方案1】:

代码

正则表达式

^(\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

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2023-03-08
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多