是否可以分割一个巨大的CSV文件并指定定界符以用于将来生成的文件。 这是我的命令行:
split -l 1000 original.csv --additional-suffix=.csv
任何帮助将不胜感激。
答案 0 :(得分:1)
这里是使用awk的一个。注意:对于文件file
,它将创建名为file-1
,file-2
等的文件。
它使用逗号作为输入字段分隔符,但是字段中是否有逗号(即"between quotes, you know"
),它们也将被视为定界符。在这种情况下,请将FS=","
替换为FPAT = "([^,]*)|(\"[^\"]+\")"
,然后使用GNU awk。
$ awk -v l=2 ' # of lines per file (l is a bit silly var name)
BEGIN {
FS="," # input delimiter
OFS=";" # output delimiter
RS="\r?\n" # THIS FORM IS GNU AWK ONLY, use:
# RS="\n" or RS="\r\n" depending on data
if(l=="") # default # of lines per file
l=1000
}
NR==1 {
filename=FILENAME "-" (c=1) # initial output filename
}
{
for(i=1;i<=NF;i++) # iterate all fields
gsub(/^\"|\"$/,"",$i) # remove quotes
$1=$1 # rebuild record in case no quotes were removed
print > filename # output to output file
if(NR%l==0) { # for once mod is your friend :D
close(filename) # close previous open output file
filename=FILENAME "-" ++c # form new output filename
}
}' file
输出或更多类似结果:
$ for f in file-? ; do echo $f: ; cat $f ; done
file-1:
51456364200024;QUALIBAT Fumisterie (Technicité courante );07/12/2015;06/12/2019
51456364200024;QUALIBAT Rénovation d'installations de chauffage (Technicité courante );07/12/2015;06/12/2019
file-2:
51456364200024;QUALITENR QualiPAC module chauffage et ECS;16/12/2018;16/12/2019
答案 1 :(得分:1)
不要重新发明轮子,有一些用于格式化CSV文件的工具。
使用cvskit
包中的csvformat
(也称为python-csvkit
或python3-csvkit
)。
我添加了另一行
"51456364200025","A string with ""quotes,"" and, commas","16/12/2018","16/12/2019"
在您的输入中显示如何处理字段中的引号和逗号。
将分隔符更改为;
:
$ csvformat --out-delimiter ';' input.csv
51456364200024;QUALIBAT Fumisterie (Technicité courante );07/12/2015;06/12/2019
51456364200024;QUALIBAT Rénovation d'installations de chauffage (Technicité courante );07/12/2015;06/12/2019
51456364200024;QUALITENR QualiPAC module chauffage et ECS;16/12/2018;16/12/2019
51456364200025;"A string with ""quotes,"" and, commas";16/12/2018;16/12/2019
或在输入数据中加上双引号字段:
$ csvformat --out-delimiter ';' --out-quoting 1 input.csv
"51456364200024";"QUALIBAT Fumisterie (Technicité courante )";"07/12/2015";"06/12/2019"
"51456364200024";"QUALIBAT Rénovation d'installations de chauffage (Technicité courante )";"07/12/2015";"06/12/2019"
"51456364200024";"QUALITENR QualiPAC module chauffage et ECS";"16/12/2018";"16/12/2019"
"51456364200025";"A string with ""quotes,"" and, commas";"16/12/2018";"16/12/2019"
由于split
命名了输出文件xaa.csv
,xab.csv
等,因此您可以像这样循环修改
for i in x*.csv; do
csvformat --out-delimiter ';' "$i" > temp && mv temp "$i"
done
答案 2 :(得分:1)
您可以使用'sed'替换引号和逗号。
<your command> | sed 's/"//g' | sed 's/,/;/g'
或者您可以使用
cat <csv_file_name> | sed 's/"//g' | sed 's/,/;/g'
如果要保存更改,可以使用'sed -i'。