Webストアに表示されるようにCSVファイルの行が変更されました。

Webストアに表示されるように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のインポートコンポーネント)。

シェルスクリプトの.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

これは以下を使用します。csvkitCSVファイルをデータベーステーブルとして扱い、すべての列(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",

;出力に-delimiterを含めるには、結果を次に渡します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とRubyモジュールが好きです。

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

関連情報