Изменения строк 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).

Я создаю csv-файл из .txt-файла в shell-скрипте.

0
09.02.2017, 12:20
4 ответа
perl -0pe 's/("[^"]*")(?=[;\n])/ $1 =~ s!\n!<br>\n!gr /gse' ex.csv
  • perl -0pe ... проглотить ввод и в конце вывести результат
  • s / ("[^"] * ") (? = [; \ N]) / action-perl / ge ... замените все строки результатом ...
  • $ 1 = ~ s! \ n!
    \ n! gr
    заменив символы новой строки на
    \ n
0
28.01.2020, 02:46

Мне нравится 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
0
28.01.2020, 02:46
$ 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 - n , всего 14 анонимных столбцов). Он заменяет буквальные символы новой строки ( char (10) ) в столбце 13 ( m ) на
с последующим переводом строки.

Результат:

,,,,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",

Если вам нужны ; -делители на выходе, передайте результат в 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";
1
28.01.2020, 02:46

Использование gawk , где RS (разделитель записей) может быть регулярным выражением .

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

Предполагается, что " в конце строки является концом записи, но этот шаблон также может соответствовать новой строке в начале поля. Когда это происходит, нет
будет вставлен туда.

Другие версии awk могут не поддерживать это. Из спецификации awk :

Если RS содержит больше чем один символ, результаты не указаны.
0
28.01.2020, 02:46

Теги

Похожие вопросы