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

时间:2019-04-03 10:40:11

标签: csv awk sed text-manipulation

我想在CSV文件的所有字段中添加引号。

我的CSV文件

  ValueError: Error when checking target: expected dense_21 to have shape (512,) but got array with shape (1,)                    

预期产量

$ cat file.csv
1,563,45645,example-text,/example/path,FILE,ftp://,11 

3 个答案:

答案 0 :(得分:0)

有许多简单直接的方法可以按照您想要的方式格式化CSV文件。但是,如果您希望CSV文件符合RFC 1410,则必须多加注意。尤其是规则7:

  
      
  1. 如果使用双引号将字段括起来,则使用双引号    出现在字段中的内容必须通过在其前面加上另一个双引号来进行转义。例如:

    "aaa","b""bb","ccc"
    
  2.   
     

来源: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
    
  2.   
     

来源: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

答案 1 :(得分: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"
$

答案 2 :(得分: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"