从CSV(双引号括起)文件如何删除数据双引号与unix

ef1yzkbh  于 2023-02-04  发布在  Unix
关注(0)|答案(3)|浏览(313)

从CSV(双引号括起来)文件如何取代数据双引号(意味着双引号内的数据)从第三个html字符串字段(它有数据逗号也即逗号内的数据)与~符号与unix。我们不应该删除任何其他双引号。
输入文件:

F1,F2,F3
"11111","ABABDBDA","<div style="text-aaa: justify;"> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala "
"22222","PPPPPPPP","<p style="text-align: justify;"> <span style="color:#ff0000;"><strong>Disponibile dal 25/03</strong></span></p> <div style="text-align: justify;"> Il manuale delinea l&rsquo;evoluzione dei , ;"> </div>"
"333333","QQQQQQQ","<p style="text-align: justify;"> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "

预期输出文件:

F1,F2,F3
"11111","ABABDBDA","<div style=~text-aaa: justify;> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala" 
"22222","PPPPPPPP","<p style=~text-align: justify;~> <span style=~color:#ff0000;~><strong>Disponibile dal 25/03</strong></span></p> <div style=~text-align: justify;~> Il manual"
"333333","QQQQQQQ","<p style=~text-align: justify;~> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione"

我尝试使用awk命令,但它没有提供预期的输出

j2qf4p5b

j2qf4p5b1#

使用Miller 6并运行

mlr --csv --lazy-quotes put '$F3=gsub($F3,"\"","~")' input.csv >output.csv

你得到

F1,F2,F3
11111,ABABDBDA,"<div style=~text-aaa: justify;~> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala "
22222,PPPPPPPP,"<p style=~text-align: justify;~> <span style=~color:#ff0000;~><strong>Disponibile dal 25/03</strong></span></p> <div style=~text-align: justify;~> Il manuale delinea l&rsquo;evoluzione dei , ;~> </div>"
333333,QQQQQQQ,"<p style=~text-align: justify;~> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "

一些注意事项:

  • --lazy-quotes,接受出现在无引号字段中的引号,以及出现在有引号字段中的非双引号
  • put '$F3=gsub($F3,"\"","~")'以搜索"并将其替换为~
x8diyxa7

x8diyxa72#

如果你在awk中找不到解决方案,这里有一个非常简单的Go语言程序,它使用标准库的CSV解析器和它的LazyQuotes选项(重点是针对你的情况而添加的):
如果LazyQuotes为true,则引号可能出现在未加引号的字段中,非双引号可能出现在加引号的字段中
从您的原始语句和示例输入来看,我认为唯一的问题是在创建CSV时HTML属性的引号没有正确转义,我认为LazyQuotes选项可以正确处理这个问题,而且在我看来,这比更改HTML更可取:

F1,F2,F3
11111,ABABDBDA,"<div style=""text-aaa: justify;""> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala "
22222,PPPPPPPP,"<p style=""text-align: justify;""> <span style=""color:#ff0000;""><strong>Disponibile dal 25/03</strong></span></p> <div style=""text-align: justify;""> Il manuale delinea l&rsquo;evoluzione dei , ;""> </div>"
333333,QQQQQQQ,"<p style=""text-align: justify;""> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "

在表格视图中:
| F1代|第二代|三层|
| - ------|- ------|- ------|
| 小行星1111|阿巴布达|IlMMM delinea l 'evvv我的cccc和我的ruorrrrli,从组织...|
| 小行星2222|噗噗噗|2003年25日解散〈/stro...|
| 小行星33333|QQQQQQ|他的书分析了他的管理,他的合伙人...|
下面是一个较小的例子来尝试和强调:
1.创建CSV阅读器
1.设置LazyQuotes选项
1.阅读所有记录
1.创建CSV编写器
1.写入所有记录
不需要特殊处理,CSV解析器只为您做正确的事情:

csvBlob := `F1,F2,F3
"11111","ABABDBDA","<div style="text-aaa: justify;"> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala "
"22222","PPPPPPPP","<p style="text-align: justify;"> <span style="color:#ff0000;"><strong>Disponibile dal 25/03</strong></span></p> <div style="text-align: justify;"> Il manuale delinea l&rsquo;evoluzione dei , ;"> </div>"
"333333","QQQQQQQ","<p style="text-align: justify;"> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "
`

fIn := strings.NewReader(csvBlob)
r := csv.NewReader(fIn)
r.LazyQuotes = true

records, _ := r.ReadAll()

w := csv.NewWriter(os.Stdout)
w.WriteAll(records)
w.Flush()

您可以在Go Playground中查看并运行它。
下面是一个更完整的示例,用于从文件读取并写入新文件,并进行错误检查:

fIn, err := os.Open("input.csv")
defer fIn.Close()
if err != nil {
  log.Fatal("could not open input.csv:", err)
}

r := csv.NewReader(fIn)
r.LazyQuotes = true

records, err := r.ReadAll()
if err != nil {
  log.Fatal("could not read CSV:", err)
}

fOut, err := os.Create("output.csv")
defer fOut.Close()
if err != nil {
  log.Fatal("could not create output.csv:", err)
}

w := csv.NewWriter(fOut)
w.WriteAll(records)
zbq4xfa0

zbq4xfa03#

您可以使用这个ruby:

ruby -r csv -e '
puts CSV.parse($<.read, **{:headers=>false, :liberal_parsing=>true}).
    map{|row| row[0..1]+[row[2..].join(",").gsub(/^"|"$/,"").gsub(/"/,"~")]}.
    map{|a| a.to_csv(**{:force_quotes=>true})}.join
' file

图纸:

"F1","F2","F3"
"11111","ABABDBDA","<div style=~text-aaa: justify;~> Il MMM delinea l&rsquo;evvv dei ccccc e dei ruorrrrli, degli organi sss, alaaaala "
"22222","PPPPPPPP","<p style=~text-align: justify;~> <span style=~color:#ff0000;~><strong>Disponibile dal 25/03</strong></span></p> <div style=~text-align: justify;~> Il manuale delinea l&rsquo;evoluzione dei , ;~> </div>"
"333333","QQQQQQQ","<p style=~text-align: justify;~> Il libro analizza i singoli cicli gestionali, partendo dalle rilevazioni, contabili per giungere poi alla destinazione di "

相关问题