这个问题在这里已有答案:
我想在CSV文件的所有字段中添加引号。
我的CSV文件
$ cat file.csv
1,563,45645,example-text,/example/path,FILE,ftp://,11
预期产出
$ cat file.csv
"1","563","45645","example-text","/example/path","FILE","ftp://","11"
试试Perl
$ cat smc.txt
1,563,45645,example-text,/example/path,FILE,ftp://,11
$ perl -lpe ' s/([^,]+)/"$1"/g ' smc.txt
"1","563","45645","example-text","/example/path","FILE","ftp://","11"
$
或使用外观
$ perl -lne ' s/^|(?<=,)|(?=,)|$/"/g ; print ' smc.txt
"1","563","45645","example-text","/example/path","FILE","ftp://","11"
$
有许多简单直接的方法可以按您希望的方式格式化CSV文件。但是,如果您希望CSV文件符合RFC 1410,则必须更加小心。特别是规则7:
- 如果使用双引号括起字段,则必须通过在其前面添加另一个双引号来转义出现在字段内的双引号。例如:
"aaa","b""bb","ccc"
这给出了以下awk解决方案:
awk 'BEGIN{FS=OFS=","}
{
for(i=1;i<=NF;++i) {
gsub("\042","\042\042",$i)
sub("^\042\042","",$i)
sub("\042\042$","",$i)
$i="\042" $i "\042"
}
}1' file.csv
此外,如果您希望符合规则1:
- 每条记录都位于一条单独的行上,由换行符(
CRLF
)分隔。例如:aaa,bbb,ccc CRLF zzz,yyy,xxx CRLF
awk 'BEGIN{FS=OFS=","; ORS="\r\n"}
{
sub("\r$","")
for(i=1;i<=NF;++i) {
gsub("\042","\042\042",$i)
sub("^\042\042","",$i)
sub("\042\042$","",$i)
$i="\042" $i "\042"
}
}1' file.csv
试试这个:
sed "s/,/\",\"/g;s/\(.*\)/\"\1\"/" file.csv
说明:
s/ # substitute
,/ # all ,
\",\" # with ","
/g # global on whole line
; # next expression
s/ # substitute
\(.*\)/ # save all into arg1 (\1)
\"\1\"/ # change to "\1"