我有一个 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