CSV 文件行发生更改以显示在网上商店中

CSV 文件行发生更改以显示在网上商店中

我有一个 csv 文件,其中包含如下项目:

"";"";"";"";"Park2";"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.";"PKT";"2";"100,0000";"-596,7500";"1";"0";"Lamella Koivu Natur Loc

- Ruotsalainen, laadukas
- 5G Lukkoponttiparketti, taitettava/painettava
- Helppo asentaa
- 3-sauvainen, mattalakattu
- Lauta 14x188x2266mm
- 3,41m2/pkt, 102,3m2/lava

29,33€/M2";""

我需要的是这样的输出:

"";"";"";"";"Park2";"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.";"PKT";"2";"100,0000";"-596,7500";"1";"0";"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2";""

或者其他可行的东西,但它并不完全像这样。我测试了手动添加 br 并且它有效。我只希望网上商店中的商品描述有行更改。现在他们不这样做了,行更改在导入过程中被删除(joomla cms 中的导入组件)。

我正在 shell 脚本中从 .txt 文件创建 csv 文件。

答案1

$ csvsql -H -d ';' --query "SELECT a,b,c,d,e,f,g,h,i,j,k,l,REPLACE(m, char(10), '<br>'||char(10)),n FROM data" data.csv

这使用csvkit将 CSV 文件视为数据库表,并选择所有列(a通过 to命名n,总共 14 个匿名列)。它将char(10)第 13 列 ( ) 中的文字换行符 ( ) 替换m<br>后跟换行符。

结果:

,,,,Park2,"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.",PKT,2,1000000,-5967500,1,0,"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2",

如果您希望;输出中包含 -delimiters,请将结果传递给csvformat

$ csvsql -H -d ';' --query "SELECT a,b,c,d,e,f,g,h,i,j,k,l,REPLACE(m, char(10), '<br>'||char(10)),n FROM data" data.csv | csvformat -D ';'
;;;;Park2;Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.;PKT;2;1000000;-5967500;1;0;"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2";

答案2

perl -0pe 's/("[^"]*")(?=[;\n])/ $1 =~ s!\n!<br>\n!gr /gse' ex.csv
  • perl -0pe...吸食输入并最后打印结果
  • s/("[^"]*")(?=[;\n])/ action-perl /ge...用...的结果替换所有字符串
  • $1 =~ s!\n!<br>\n!gr将换行符替换为<br>\n

答案3

使用gawk, 哪里RS(记录分隔符)可能是正则表达式

BEGIN {
    RS="\"\n"
}
{
    gsub("\n","<br>\n")
    print
}

这假设"行末尾的 a 是记录的末尾,但该模式也可以匹配字段开头的换行符。当发生这种情况时,不会<br>在那里插入任何内容。

其他版本awk可能不支持此功能。来自awk规格

如果 RS 包含多个字符,则结果未指定。

答案4

我喜欢 ruby​​ 及其 CSV 模块:

ruby -e '
  require "csv"
  options = {:col_sep => ";", :force_quotes => true}
  new_csv = CSV.generate(options) {|csv|
    CSV.foreach(ARGV.shift, options) {|row|
      row[-2].gsub!(/\n/, "<br>\n")
      csv << row
    }
  }
  puts new_csv
' file.csv

相关内容