У меня есть 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-скрипте.
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
Мне нравится 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
$ 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";
Использование gawk
, где RS
(разделитель записей) может быть регулярным выражением .
BEGIN {
RS="\"\n"
}
{
gsub("\n","<br>\n")
print
}
Предполагается, что "
в конце строки является концом записи, но этот шаблон также может соответствовать новой строке в начале поля. Когда это происходит, нет
будет вставлен туда.
Другие версии awk
могут не поддерживать это. Из спецификации awk
:
Если RS содержит больше чем один символ, результаты не указаны.