【问题标题】:How to remove the nth occurrence of a substring from each line on four 100GB files如何从四个 100GB 文件的每一行中删除第 n 次出现的子字符串
【发布时间】:2018-03-11 19:36:42
【问题描述】:

我有 4 个 100GB 的 csv 文件,其中两个字段需要连接。幸运的是,这两个字段彼此相邻。

我的想法是从每行中删除第 41 次出现的 ",",然后我的两个字段将正确合并并准备上传到我使用的分析工具。

开发机器是具有 4 x 3.6GHz 和 64G RAM 的 Windows 10 机器,我将文件推送到具有 40 x 2.4GHz 和 512G RAM 的 Centos 7 系统上的服务器。我在服务器上有 sudo 访问权限,如果有人有依赖于 Linux 工具的解决方案,我可以在技术上更改文件。我们的想法是以最快/最简单的方式完成任务。我必须每月重复一次这项任务,并且会欣喜若狂地自动化它。

我最初的实现方法是将 csv 加载到 MySQL,连接字段并删除旧字段。再次将表导出为 csv 并推送到服务器。这需要两天时间,而且很费力。

现在我在学习使用 sed 还是使用我更熟悉的东西(如 node.js)将文件逐行流式传输到新文件然后推送这些文件之间纠结到服务器。

如果您推荐使用 sed,我已经阅读了 herehere,但不知道如何从每一行中删除第 n 个出现

编辑: Cyrus 要求提供样本输入/输出。 输入文件格式如下:

"field1","field2",".........","field41","field42","......

输出文件格式如下:

"field1","field2",".........","field41field42","......

【问题讨论】:

  • 您的 csv 是否在双引号之间也有 ,
  • “从每一行”部分基本上是 sed 和类似工具的整体思想,所有命令都应用于​​每一行输入。
  • 您对正则表达式的熟悉程度如何?有一些 *nix 命令行实用程序可以使用正则表达式执行此操作。 (sed 甚至可能是其中之一)
  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 对于这些巨大的文件,一个问题是磁盘空间,因为大多数文本处理工具会创建一个临时文件来写入更改。我发现这篇文章非常好:backreference.org/2011/01/29/in-place-editing-of-files

标签: node.js csv text sed


【解决方案1】:

如果您想删除第 41 次出现的 ,,那么您可以尝试:

sed -i 's/","//41' file

【讨论】:

  • 这行得通吗? sed -i 's/\"\,\"//41' file.csv sed 会创建新文件吗?必须包含双引号,因为它们包含必须连接的两个字符串。
  • 不需要空格,但需要双引号。
  • 你能把你的输入行粘贴到这里吗?
  • 这应该可以工作:sed 's/","//41' file.csv > new.csv
  • 请注意,如果字段包含逗号周围的转义引号(可以由 Excel 生成并符合 RFC),例如像"fieldNpart1"",""fieldNpart2" 这样的字段。这当然不太可能发生,但由于您的文件很大,而且我们不知道是什么生成它们 - 永远不要说永远......
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多