【问题标题】:OS X , how to merge bulk csv files into an excel worksheet?OS X,如何将批量 csv 文件合并到 excel 工作表中?
【发布时间】:2017-01-18 04:46:44
【问题描述】:

OS X,我在一个文件夹中有 50000 个 csv 文件。如何将所有这些 csv 文件的指定范围合并到 excel 工作表中?

ps。所有这些 csv 文件都采用相同的格式。他们每个人都有两列。我想要的是第二列的中间部分,B45:B145。在新的 excel 工作表中,我希望每个 csv 文件中的数据彼此相邻粘贴。结果在一个工作表中。

感谢以下建议。我已经找到了解决这个问题的方法。

find . -name \*.csv -print0 | xargs -0 -L 256 awk -F, 'FNR>=45 && FNR<=145{print $2}' > BigBoy.csv

【问题讨论】:

  • 这是一个非常广泛的问题,可能需要一些额外的信息。例如,这 50,000 个文件中的每一个是否都属于同一种表格(列数相同?),还是您希望将这 50,000 个文件作为不同的选项卡/页面全部合并到 Excel 工作表中?
  • @MichaelDautermann 谢谢。我已经更新了我的问题。

标签: macos excel terminal vba


【解决方案1】:

请使用单个 CSV 文件尝试以下命令,看看它是否提取了您想要的字段:

awk -F, 'FNR>=45 && FNR<=145{print $2}'   AnySingleFile.csv

它打印行号大于或等于 45 且小于或等于 145 的所有行的第二个字段 ($2)。-F, 将字段分隔符设置为逗号。

如果可行,下一个要尝试的命令是这个,但我怀疑它是否适用于 50,000 个文件:

awk -F, 'FNR>=45 && FNR<=145{print $2}' *.csv   > BigBoy.csv

所以,我建议你使用 findxargs 来处理,比如说 256 个文件,一次:

find . -name \*.csv -print0 | xargs -0 -L 256 awk -F, 'FNR>=45 && FNR<=145{print $2}' > BigBoy.csv

该命令的工作方式如下...'查找所有以.csv 结尾的文件并打印它们的名称,并用空字符分隔,将该列表传递给xargs。然后它将拆分列表并一次将 256 个文件传递给 awk,这将与最初的 awk 完全相同。"

将 256 个文件传递给 awk 的想法是不必为 50,000 个 CSV 文件中的每一个文件执行一个新进程。根据文件名的长度,您可能会获得更大的数字。见文末注释。

你的结果应该在BigBoy.csv

注意 1:如果您的 CSV 文件有数百行,则将awk 代码更改为:

'FNR>=45 && FNR

注意 2: 传递给 awk(和任何其他程序)的参数长度限制(以字符为单位)可以通过以下方式找到:

sysctl kern.argmax

在 OSX 上,它是 262,144 个字符。因此,如果您的 CSV 文件名平均长度为 8-10 个字符,则您可能会传递超过 26,000 个文件名。如果它们平均长度为 260 个字符,则传递的文件名不应超过 1,000 个。

【讨论】:

  • 是的,awk -F, 'FNR&gt;=45 &amp;&amp; FNR&lt;=145{print $2}' *.csv &gt; BigBoy.csv 不适用于 50000 个文件。但是find . -name \*.csv -print0 | xargs -0 -L 256 awk -F, 'FNR&gt;=45 &amp;&amp; FNR&lt;=145{print $2}' &gt; BigBoy.csv 完美解决了我的问题。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多