gpt4 book ai didi

linux - 如何根据多个条件将大文件 ".csv"分成小文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:39 24 4
gpt4 key购买 nike

我有很大的 .csv 文件(~40MB),我想根据几个条件将它们分成较小的文件,并根据数据命名它们:

  1. 按第 3 列的内容分隔文件,
  2. 通过第 4 列内容将第 1 点的输出分开,

这是棘手的部分:

  1. 通过 2 个先前操作创建的输出检查第 11 列中是否有任何数据,如果是,则根据内容将此数据分开,然后根据第 17 列的内容分开 -> 然后保存输出/或/与/
  2. 如果第 11 列中没有数据,请检查第 15 列并相应地分开。接下来检查第 17 列并将此数据按第 17 列分开 -> 保存输出。

我在 VBA 中有类似的东西,但它对于大文件来说太慢了,而且 excel 有时会崩溃。对于这样的多个文件,需要很长时间才能手动将它们剪切下来,然后将 vba 投入使用。

这么大的条件能切文件吗?

在此先感谢您的帮助。

例子:(标题是列的#)

1       2   3   4   11  15  17
Date Time COUNTRY CITY CHECK TEST TEST2
2015-08-20 11:54 ENGLAND ABINGDON 1 1
2015-08-21 12:54 ENGLAND BATLEY 2 5
2015-08-22 13:54 ENGLAND FROME 2 6
2015-08-23 14:54 ENGLAND FROME 2 1
2015-08-24 15:54 USA CALIFORNIA 4 8
2015-08-25 16:54 USA CONNECTICUT 4 9
2015-08-26 17:54 USA DELAWARE 1 8
2015-08-27 18:54 GERMANY SAXONY 6 9
2015-08-28 19:54 GERMANY SAXONY 6 10
2015-08-27 18:54 GERMANY SAXONY 4 11
2015-08-28 19:54 GERMANY SAXONY 4 14
2015-08-29 20:54 GERMANY HESSE 8
2015-08-29 20:54 GERMANY HESSE 1 8

File1
2015-08-20 11:54 ENGLAND ABINGDON 1 1

File2
2015-08-21 12:54 ENGLAND BATLEY 2 5

File3
2015-08-22 13:54 ENGLAND FROME 2 6

File4
2015-08-23 14:54 ENGLAND FROME 2 1

File5
2015-08-24 15:54 USA CALIFORNIA 4 8

File6
2015-08-25 16:54 USA CONNECTICUT 4 9

File7
2015-08-26 17:54 USA DELAWARE 1 8

File8
2015-08-27 18:54 GERMANY SAXONY 4 9
2015-08-28 19:54 GERMANY SAXONY 4 10

File9
2015-08-27 18:54 GERMANY SAXONY 6 11
2015-08-28 19:54 GERMANY SAXONY 6 14

File10
2015-08-29 20:54 GERMANY HESSE 8

File11
2015-08-29 20:54 GERMANY HESSE 1 8

最佳答案

您的数据无处不在!它不在您描述的列中,也不是制表符分隔的。你没有让生活变得轻松!

用你的真实数据试试这个 awk 看看它是否生成一个你可以使用的输出文件名。

awk -F'\t' '{
f=$3 "_" $4 # filename = field3 _ field4
if(length($11)){ # if f11 not null
f=f "_A_" $11 "_" $17 # filename = filename _A_ field11 _ field17
}else{ # else
f=f "_B_" $15 "_" $17 # filename = filename _B_ field15 _ field17
}
print f}' file.csv

你应该得到这样的东西

ENGLAND_ABINGDON_A_3_1
ENGLAND_ABINGDON_A_4_2
GENRMANY_SAXONY_B_5_3

基本上它使用 awk 并告诉它您的字段分隔符是制表符。然后它查看每一行并通过查看您描述的字段在变量 f 中构建输出文件名。

如果按照您的意思分隔数据,您实际上可以通过像这样简单地更改最后一行来将当前行输出到具有相应名称的文件:

awk -F'\t' '{
f=$3 "_" $4 # filename = field3 _ field4
if(length($11)){ # if f11 not null
f=f "_A_" $11 "_" $17 # filename = filename _A_ field11 _ field17
}else{ # else
f=f "_B_" $15 "_" $17 # filename = filename _B_ field15 _ field17
}
print > f}' file.csv

基本上它打印文件而不是打印它的名字,如果你改变了

print f

print > f

制定标题

如果你想在每个输出文件上都有一个标题,我们需要更努力地工作......

首先,我们需要保存原始文件的文件头,所以如果我们假设它是第 1 条记录,我们会这样做

awk -F'\t' '
NR==1 {header=$0} # save first line as header
{f=$3 "_" $4 # filename = field3 _ field4
...
... as before

现在我们需要在开始写入新文件时输出标题行,这“有趣”因为我们只是为每一行动态创建输出文件名!因此,我们需要“记住”我们写入了哪些文件,然后仅在写入新文件时发出 header 。我这里没有你的一组像样的数据,所以我猜测这一点!

awk -F'\t' '
NR==1 {header=$0} # save first line as header
{f=$3 "_" $4 # filename = field3 _ field4
if(length($11)){ # if f11 not null
f=f "_A_" $11 "_" $17 # filename = filename _A_ field11 _ field17
}else{ # else
f=f "_B_" $15 "_" $17 # filename = filename _B_ field15 _ field17
}
# Emit header if first write to this filename
if(!(f in fileswritten)){
fileswritten[f]++ # note that we have written to this file
print header > f # emit header
}
print > f}' file.csv

关于linux - 如何根据多个条件将大文件 ".csv"分成小文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32114672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com