忽略引号内的定界符

阿希什(Ashish K)

我有一个.csv文件如下:

"ID0054XX","PT. SUMUT","18 JL.BONJOL","SUMATERA UTARA, NORTH","MEDAN","","ID9856","PDSUIDSAXXX","","","","Y"
"ID00037687","PAN INDONESIA, PT.","JALAN JENDERAL, SUDIRMAN, SENAYAN","","INDIA","","ID566543","PINBIDJAXXX","","0601","","Y"

我有一个脚本,使用逗号,作为分隔符,将每个逗号分隔的值分配给唯一变量

该脚本的部分如下所示:

IFS=,

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }

while read Key  Name    Address1        Address2        City    State   Country SwiftCode       Nid     Chips   Aba     IsSwitching
do
          echo "-------------------------------------------------------------------"

     echo "From Key : $Key"

    echo "-------------------------------------------------------------------"
          echo "-------------------------------------------------------------------"

     echo "From Name : $Name"

它的作用是将引号内带有逗号的值与我期望的将每个值唯一地分离为其各自变量的输出分开。

我尝试替换逗号,IFS=[","]但没有运气。任何建议/帮助都非常感谢。

芒登

您在这里做错了几件事:

  1. 您正在使用Shell解析文本。

    尽管这是可能的,但效率非常低。它很慢,很难写,很难阅读并且很难正确执行。外壳不是为这种事情而设计的。

  2. 您正在尝试在没有csv解析器的情况下解析csv文件。

    CSV不是一种简单的格式。您可以像在此处那样包含包含定界符的字段。您还可以具有跨多行的字段。尝试使用简单的模式匹配来解析任意CSV数据非常非常复杂,而且非常难以解决。

糟糕的解决方案是执行以下操作:

$ sed 's/","/"|"/g' file.csv | 
    while IFS='|' read -r Key Name Address1 Address2 City \
     State Country SwiftCode Nid Chips Aba IsSwitching; do 
        echo "From Key : $Key"; echo "From Name : $Name"; 
    done
From Key : "ID0054XX"
From Name : "PT. SUMUT"
From Key : "ID00037687"
From Name : "PAN INDONESIA, PT."

这将替换为所有",""|"然后|用作定界符。当然,如果您的任何字段都可以包含,那将失败|

干净的好方法是使用适当的脚本语言(而不是外壳程序)和csv解析器。例如,在Perl 1中

$ cat file.csv | perl -MText::CSV -le '
    $csv = Text::CSV->new({binary=>1}); 
    while ($row = $csv->getline(STDIN)){ my ($Key, $Name, $Address1, $Address2, $City, $State, $Country, $SwiftCode, $Nid, $Chips, $Aba, $IsSwitching) = @$row;
print "From Key: $Key\nFrom Name: $Name";}' 
From Key: ID0054XX
From Name: PT. SUMUT
From Key: ID00037687
From Name: PAN INDONESIA, PT.
    

或者,作为脚本:

#!/usr/bin/perl -l
use strict;
use warnings;
use Text::CSV;

open(my $fh, "file.csv");
my $csv = Text::CSV->new({binary=>1}); 
while (my $row = $csv->getline($fh)){
    my (
            $Key, $Name, $Address1, $Address2, $City,
            $State, $Country, $SwiftCode, $Nid, $Chips,
            $Aba, $IsSwitching
         ) = @$row;
    print "From Key: $Key\nFrom Name: $Name";
}

请注意,您必须先安装Text::CSV模块(cpanm Text::CSV),然后可能要安装cpanmcpanminus大多数发行版中的软件包

另外,在Python 3中:

#!/usr/bin/env python3

import csv
with open('file.csv', newline='') as csvfile:
    linereader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in linereader:
        print("From Key: %s\nFrom Name: %s" % (row[0], row[1]))
    

将上面的Python代码另存为脚本并在文件上执行将打印:

$ foo.py
From Key: ID0054XX
From Name: PT. SUMUT
From Key: ID00037687
From Name: PAN INDONESIA, PT.
    

1是的,我知道这是一个UUoC,但是用这种方式写为一个衬纸更简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

拆分字符串并忽略引号内的定界符

来自分类Dev

用多个定界符分割字符串,并忽略引号中的定界符javascript

来自分类Dev

如何使用字符串定界符拆分字符串,而忽略引号内的定界符并生成空字符串?

来自分类Dev

bash中的字符串定界忽略引号中的定界符

来自分类Dev

Notepad ++忽略RegEx的结束定界符

来自分类Dev

Bash IFS忽略了行尾的定界符

来自分类Dev

如何删除字符并忽略定界符?

来自分类Dev

如何使用定界符分割字符串(不在双引号内)

来自分类Dev

创建Pandas数据框时如何忽略括号内的定界符?

来自分类Dev

Psycopg2“ copy_from”命令,是否可以忽略引号中的定界符(获取错误)?

来自分类Dev

用多个定界符分割字符串,忽略重复的定界符

来自分类Dev

如何在sed中忽略单词定界符

来自分类Dev

解析字符串时忽略后续定界符

来自分类Dev

使用定界符时在字符之间忽略

来自分类Dev

用于根据定界符的位置在定界符内进行替换的UNIX命令

来自分类Dev

在定界符更换

来自分类Dev

替换定界符

来自分类Dev

定义定界符

来自分类Dev

关于定界符

来自分类Dev

数数 行中的定界符,而忽略作为数据值一部分的定界符

来自分类Dev

使用定界符数组

来自分类Dev

设置rxImport的定界符

来自分类Dev

PHP Regex定界符

来自分类Dev

使用定界符angularJS

来自分类Dev

多个作者定界符

来自分类Dev

将双引号定界符添加到CSV文件中

来自分类Dev

正则表达式-反引号-字定界符?

来自分类Dev

打印不带定界符的字符串数组(括号,引号和逗号)

来自分类Dev

正则表达式涉及嵌套定界符/引号