Regex 使用字段模式使用awk处理非公共csv文件

Regex 使用字段模式使用awk处理非公共csv文件,regex,csv,awk,Regex,Csv,Awk,我的银行使用发送非通用CSV文件作为字段分隔符和二进制代码(十六进制a0或八进制240),用于将a所在的字段括起来可能发生,如下所示: 输入 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

我的银行使用
发送非通用CSV文件
作为字段分隔符和二进制代码(十六进制
a0
或八进制
240
),用于将a
所在的字段括起来可能发生,如下所示:

输入

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
{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}
我需要用AWK处理字段2、5和6

所需输出

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
{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 "}" 
}
我发现了一个类似的情况(请参阅),但将
更改为
\“
\240
中的代码没有起作用


我需要帮助来实现
FPAT
模式,以便在所有情况下正确扫描我的CSV文件。

您可以将此
gnu awk
用于
FPAT

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


-v FPAT='[^;\xa0]+“
将字段模式设置为任何非
且非
\xa0

字符的1+。请注意,csv格式不是标准格式,即使逗号作为分隔符和双引号作为保护字符更为常见,使用分号和不可断开的空格也没有错。此外,请注意不可断开的空格le space,可能还有所有文件,都是用ISO8859-1编码编写的,而不是UTF-8。@CasimiritHippolyte:好的,我将编辑我的问题,以便将“非标准”更改为“非通用”“。我不知道该文件是UTF-8还是ISO8859-1编码,因为我看不到带重音的字母。@CasimiritHippolyte:的确,我在另一个文件中看到我的银行根据ISO8859-1编码。如果我将文件转换为UTF-8,我将获得序列
\xc2\xa0
,而不是
\xa0
,这在anubhava提出的
FPAT
中无法使用。我必须找到一个解决办法…没有什么禁止在之后将anubhava脚本的结果编码为UTF-8。此外,如果您选择在之前转换文件,您可以将FPAT更改为
[^;\xc2]+(\xc2[^\xa0][^;\xc2]*)*(\xc2[^\xa0][^;\xc2]*)+
(没有输入错误),谢谢,但我仍然需要添加一条语句
gsub(/\xa0/,“,”,$5)
以清除二进制字符。我在
FPAT
中通过
*
更改了
+
,以匹配空字段。毕竟,我认为将
FPAT
设置为
[^;\xa0]*
将包含
\xa0
的字符串分成两部分,当它包含
,这是我想要避免的。因为regex是
[^;\xa0]+
,它将使一个
\xa0是一个分隔符,而不是两个分隔符。但是,我无法从您的输入中真正找出
\xa0
的位置。