Простая текстовая таблица в CSV Linux - PullRequest
1 голос
/ 10 июля 2019

У меня есть какая-то таблица в виде открытого текста, и мне нужно вывести ее в формате csv, если я выполню tr и заменю символы. У меня возникают некоторые проблемы с полем, когда у меня есть 2 строки.

cat file.txt | tr -s '|' ' ' | tr -s '_' ' '

Исходная таблица:

 ____________________________________________________________________________
|      Name                 |   AB    | DATA     | SOME  | IF     | DATE    |
|___________________________|_________|__________|_______|________|__(UTC)__|
|   Marra Carolina Odoriz   |         |          |       |        |2019-07- |
|           Dolman           |36737202 |098787267 |  45   |   -    |09T10:35:|
|____________________________|_________|__________|_______|________|_50.289Z_|
|                            |         |          |       |        |2019-07- |
|             -              |53959997 |098543650 |  30   |   -    |09T12:02:|
|____________________________|_________|__________|_______|________|_36.746Z_|
|                            |         |          |       |        |2019-07- |
|      Vic Velazquez         |33577915 |096638025 |   -   |  6000  |09T12:40:|
|____________________________|_________|__________|_______|________|_17.754Z_|
| Gabriela Letacia Cararallo |         |          |       |        |2019-07- |
|         Vacchetzi          |43132876 |091322398 |  30   |   -    |09T12:40:|
|____________________________|_________|__________|_______|________|_40.887Z_|

Мне нужен вывод csv. Для этого простого примера таблицы:

NAME;AB;DATA;SOME;IF;DATE (UTC)
Marra Carolina Odoriz Dolman;36737202;098787267;45;-;2019-07-09T10:35:50.289Z
-;53959997;098543650;30;-;2019-07-09T12:02:36.746Z
Vic Velazquez;33577915;096638025;-;6000;2019-07-09T12:40:17.754Z
Gabriela Letacia Cararallo Vacchetzi;43132876;091322398;30;-;2019-0709T12:40:40.887Z

Если у меня есть оригинальный мульти-линейный входной файл без «таблицы ascii» дизайна, может применить это частичное решение к делу?Я запросил:

while(<>)
{

    @vals = split /\ /; # split fields into the val array (now I take the blank space)
    $size = @vals;
    for( $i = 0 ; $i < $size ; $i++ )
    {
        #clean up the values: remove underscores and extra spaces
        #remove semicolons
        $vals[$i] =~ s/_/ /g;
        $vals[$i] =~ s/;/ /g;
        $vals[$i] =~ s/^ *//;
        $vals[$i] =~ s/ *$//;

        # append the value to the data record for this field
        $data[$i] .= $vals[$i];

        # special handling for first field: use spaces when joining
        $data[$i] .= " " if ($i==0);
    }
   if(/\R/)  # Taking four underscores to indicate the end of the record 
             # now taking the return of carriage of new line how end of the record
    {
        # clean up the first record; trim spaces
        $data[0] =~ s/^ *//;
        $data[0] =~ s/ *$//;
        $data[3] =~ s/\..*//;

        # join the records with semicolons
        $line = join (";", @data);

        # collapse multiple spaces
        $line =~ s/ +/ /g;

        # print this line and start over
        print "$line\n" unless ($line eq '');
        @data = ();
    }
}

С этим решением получен следующий результат:

ИМЯ; ПОЛНОЕ ;;;;;;;;; AB ;;;;;;; DATA;;; НЕКОТОРЫЕ ;; ДАТА; (UTC) Марра; Каролина; Одорис ;;;;; 36737202; 098787267; 45; -; 2019-07-09T10: 35: 50.289Z

Долман ;;;

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Многострочная обработка жестка в оболочке, но проста, скажем, в perl.

blocktab2csv.pl:

while(<>)
{
    chomp; # remove newline
    s/^\|//; # remove pipe at the start of the line

    @vals = split /\|/; # split fields into the val array
    $size = @vals;
    for( $i = 0 ; $i < $size ; $i++ )
    {
        #clean up the values: remove underscores and extra spaces
        $vals[$i] =~ s/_//g;
        $vals[$i] =~ s/^ *//;
        $vals[$i] =~ s/ *$//;

        # append the value to the data record for this field
        $data[$i] .= $vals[$i];

        # special handling for first field: use spaces when joining
        $data[$i] .= " " if ($i==0);
    }
    if(/____/)  # Taking four underscores to indicate the end of the record
    {
        # clean up the first record; trim spaces
        $data[0] =~ s/^ *//;
        $data[0] =~ s/ *$//;

        # join the records with semicolons
        $line = join (";", @data);

        # collapse multiple spaces
        $line =~ s/ +/ /g;

        # print this line and start over
        print "$line\n" unless ($line eq '');
        @data = ();
    }
}

Тогда

$ perl blocktab2csv.pl intable.txt > output.csv

output.csv:

Name;AB;DATA;SOME;IF;DATE(UTC)
Marra Carolina Odoriz Dolman;36737202;098787267;45;-;2019-07-09T10:35:50.289Z
-;53959997;098543650;30;-;2019-07-09T12:02:36.746Z
Vic Velazquez;33577915;096638025;-;6000;2019-07-09T12:40:17.754Z
Gabriela Letacia Cararallo Vacchetzi;43132876;091322398;30;-;2019-07-09T12:40:40.887Z

Предполагается, что в ваших полях нет точек с запятой.Хотя достаточно легко изменить, чтобы справиться с ними.

0 голосов
/ 10 июля 2019

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

sed 's/|/,/g' input.csv >output.csv

Также я бы порекомендовалпроверка вашего файла, если в нем уже есть запятые, так как это вызовет проблемы в будущем.Возможно, разделите файл вкладками для ~, если в файле нет строки, заключенной в разделитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...