【发布时间】:2020-07-25 00:29:17
【问题描述】:
(改编自大卫·埃里克森的问题here)
给定一个包含 A、B 和 C 列以及一些值的 CSV 文件:
echo 'a,b,c' > file.csv
head -c 10000000 /dev/urandom | od -d | awk 'BEGIN{OFS = ","}{print $2, $3, $4}' | head -n 10000 >> file.csv
我们想按列 a 和 b 排序:
sort -t ',' -k1,1n -k2,2n file.csv > file_.csv
head -n 3 file_.csv
>a,b,c
3,50240,18792
7,54871,39438
然后为每个唯一对 (a, b) 创建一个名为 '{a}_Invoice_{b}.csv' 的新 CSV。
主要挑战似乎是写入数千个文件的 I/O 开销 - 我开始尝试使用 awk,但遇到了 awk: 17 makes too many open files。
在 awk、Python 或其他一些脚本语言中是否有更快的方法来执行此操作?
附加信息:
- 我知道我可以在 Pandas 中做到这一点 - 我正在寻找一种使用文本处理的更快方法
- 虽然我使用
urandom生成样本数据,但实际数据具有重复值的运行:例如a=3, b=7的几行。如果是这样,这些应该保存为一个文件。 (这个想法是复制 Pandas 的 groupby -> to_csv)
【问题讨论】:
-
你可以尝试用 pandas 加载你的原始文件,按 (a,b) 排序并从那里存储。见python-splitting-dataframe-into-multiple-dataframes-based-on-column-values-and。正如你的问题是题外话并使用多种语言。
-
如果您只关心前两列,为什么不在排序和
.csv文件创建之前删除第 3 列? -
@rtx13 此示例中 C 列的数据仍然相关。它只是不是基于 A 列和 B 列的动态文件名的一部分。从原始链接问题中,我发现我在 python 中的方法生成 .csv 文件的速度有点慢,我想知道是否有更快的方法在蟒蛇。 JoshFriedlander 认为这可能是 awk 非常快的事情。