Обрабатывать нестандартный CSV-файл с помощью awk, используя шаблоны полей - PullRequest
1 голос
/ 14 апреля 2020

Мой банк отправляет нестандартный файл CSV, используя ; в качестве разделителя полей и двоичный код (шестнадцатеричный a0 или восьмеричный 240), чтобы заключить поля, в которых может возникнуть ;, как показано ниже:

Ввод

Extrait;Date;Date valeur;Compte;Description;Montant;Devise
�2020/0001/0002�;29.02.2020;29.02.2020;-;�28/02/20 Some shop in Antwerp     A Antwerpen (BE)�;-16,50;EUR
�2020/0001/0001�;01.02.2020;01.02.2020;-;�31/01/20 Some shop in Zaventem    Z Zaventem (BE)�;-13,00;EUR

Мне нужно обработать поля 2, 5 и 6 с помощью AWK.

Требуемый вывод

{Date}{Description}{Montant}
{29.02.2020}{28/02/20 Some shop in Antwerp     A Antwerpen (BE)}{-16,50}
{01.02.2020}{31/01/20 Some shop in Zaventem    Z Zaventem (BE)}{-13,00}

До сих пор, пока поля, заключенные в , не содержат ; приведенного ниже сценария с использованием переменной FPAT работает:

#!/usr/bin/awk -f
BEGIN { 
  FS=";"
  FPAT="[^;]*"                        # this works but not in all cases
  #FPAT="([^;]*)|(\240[^\240]+\240)"  # this doesn't work
}
{ gsub (/\240/, "", $5)               # I wish I could skip this instruction too
  print "{" $2 "}{" $5 "}{" $6 "}" 
}

Я нашел похожий случай (см. awk FPAT, чтобы игнорировать запятые в csv ), но изменив , на ; и \" в \240 ничего не вышло.

Мне нужна помощь для реализации шаблона FPAT для правильного сканирования моего CSV-файла во всех случаях.

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете использовать это gnu awk с FPAT:

awk -v FPAT='[^;\xa0]+' '{printf "{%s}{%s}{%s}\n", $2, $5, $6}' file

{Date}{Description}{Montant}
{29.02.2020}{28/02/20 Some shop in Antwerp     A Antwerpen (BE)}{-16,50}
{01.02.2020}{31/01/20 Some shop in Zaventem    Z Zaventem (BE)}{-13,00}

-v FPAT='[^;\xa0]+' устанавливает шаблон поля как 1+ любого символа, который не ; а не \xa0.

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