Переформатируйте текстовое содержимое в CSV

. Если это статический файл, скорее всего, ваш браузер действительно не получает новый файл, вы можете проверить это, нажатие Shift при нажатии кнопки «Обновить» (по крайней мере, в Firefox).

Если это не сработает, возможно, ваш веб-сервер не замечает изменений, и в этом случае обычно достаточно перезагрузки веб-сервера. Например, для apache2

service  apache2 reload

или

systemctl reload apache2.service

В крайних случаях вам может потребоваться перезапустить веб-сервер. В любом случае : w в vi сохраняет файл, если у vi возникнут проблемы, он уведомит вас.

-1
08.11.2015, 09:27
2 ответа

Вот сценарий 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
0
29.04.2021, 00:21

Используя 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"

Для вышеуказанного решения требуется оболочка, которая понимает подстановки процессов с помощью <(...) .

0
29.04.2021, 00:21

Теги

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