分割指定分隔符的CSV文件

时间:2019-12-17 12:52:41

标签: bash split

是否可以分割一个巨大的CSV文件并指定定界符以用于将来生成的文件。 这是我的命令行:

split -l 1000 original.csv --additional-suffix=.csv

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

这里是使用awk的一个。注意:对于文件file,它将创建名为file-1file-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-csvkitpython3-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.csvxab.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'。