在CSV文件的所有字段周围添加双引号[重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我想在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"
csv awk sed text-manipulation
3个回答
0
投票

试试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"
$

0
投票

有许多简单直接的方法可以按您希望的方式格式化CSV文件。但是,如果您希望CSV文件符合RFC 1410,则必须更加小心。特别是规则7:

  1. 如果使用双引号括起字段,则必须通过在其前面添加另一个双引号来转义出现在字段内的双引号。例如: "aaa","b""bb","ccc"

来源:RFC 1410: Common Format and MIME Type for CSV Files

这给出了以下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:

  1. 每条记录都位于一条单独的行上,由换行符(CRLF)分隔。例如: aaa,bbb,ccc CRLF zzz,yyy,xxx CRLF

来源:RFC 1410: Common Format and MIME Type for CSV Files

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

0
投票

试试这个:

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"
© www.soinside.com 2019 - 2024. All rights reserved.