. Если это статический файл, скорее всего, ваш браузер действительно не получает новый файл, вы можете проверить это, нажатие Shift при нажатии кнопки «Обновить» (по крайней мере, в Firefox).
Если это не сработает, возможно, ваш веб-сервер не замечает изменений, и в этом случае обычно достаточно перезагрузки веб-сервера. Например, для apache2
service apache2 reload
или
systemctl reload apache2.service
В крайних случаях вам может потребоваться перезапустить веб-сервер. В любом случае : w
в vi
сохраняет файл, если у vi
возникнут проблемы, он уведомит вас.
Вот сценарий perl, который считывает каждую строку, разбивает их на поля (в массиве @line) и добавляет их в массив @out. Когда в @out есть 6 полей, он распечатывает их.
Примечание: это очень простой CSV без кавычек строк и т. Д. - кавычки не нужны, если поля не содержат разделитель полей (то есть запятая, ,
). Для более продвинутого CSV его необходимо изменить для использования модулей Perl Text :: CSV
или DBD :: CSV
.
Обратите внимание, что здесь предполагается, что Фамилия, Имя и Отчество состоят только из одного слова.
#! /usr/bin/perl
use strict;
my @out = ();
while(<>) {
my @line = split /,?\s+/;
my $numfields=@line - 1;
if ($line[0] =~ m/^\d+$/) {
push @out, $line[1];
} elsif ($numfields > 1) {
push @out, (@line[0..1], join(" ",@line[2..$numfields]));
} else {
push @out, @line
}
if ( @out == 6 ) { print join(",",@out),"\n" ; @out=() } ;
}
Пример вывода (используя ваш пример ввода, сохраненный как input.txt
:
$ ./convert-to-csv.pl input.txt
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER
Используя paste
:
$ paste -d '|' - - - - <data.in >data.tmp1
$ cat data.tmp1
1 mm/dd/yyyy|LastName, FirstName MiddleName|ID-NUMBER-HERE|GENDER
2 mm/dd/yyyy|LastName, FirstName MiddleName|ID-NUMBER-HERE|GENDER
Теперь, когда у нас есть это, мы можем отфильтровать числа из первого поля и заменить любую запятую или пробел во втором поле на |
:
$ awk -F '|' 'BEGIN { OFS=FS } { gsub("^[0-9]* ", "", $1); gsub("[, ]+", "|", $2); print }' data.tmp1 >data.tmp2
$ cat data.tmp2
mm/dd/yyyy|LastName|FirstName|MiddleName|ID-NUMBER-HERE|GENDER
mm/dd/yyyy|LastName|FirstName|MiddleName|ID-NUMBER-HERE|GENDER
Чтобы переформатировать даты:
$ awk -F'/' '{ printf("%s-%s-%s\n", $3, $1, $2) }' <( cut -d'|' -f1 data.tmp2 )
yyyy-mm-dd
yyyy-mm-dd
Это может быть заменено данными:
$ paste -d '|' \
<( awk -F'/' '{ printf("%s-%s-%s\n", $3, $1, $2) }' <( cut -d'|' -f1 data.tmp2 ) ) \
<( cut -d '|' -f 2- data.tmp2 ) >data.tmp3
$ cat data.tmp3
yyyy-mm-dd|LastName|FirstName|MiddleName|ID-NUMBER-HERE|GENDER
yyyy-mm-dd|LastName|FirstName|MiddleName|ID-NUMBER-HERE|GENDER
Если у вас есть csvkit
, это может быть преобразовано в CSV с правильными кавычками и разделенными запятыми:
$ csvformat -d '|' -D ',' -U 2 <data.tmp3
"yyyy-mm-dd","LastName","FirstName","MiddleName","ID-NUMBER-HERE","GENDER"
"yyyy-mm-dd","LastName","FirstName","MiddleName","ID-NUMBER-HERE","GENDER"
Для вышеуказанного решения требуется оболочка, которая понимает подстановки процессов с помощью <(...)
.