代码之家  ›  专栏  ›  技术社区  ›  kathleen

Perl通过嵌入逗号高效解析CSV并添加到数据库

  •  -1
  • kathleen  · 技术社区  · 7 年前

    如何将正则表达式应用于数组。在阅读我的csv文件时,我应用了这个。。。

            s/, /- /g;
            s/1,000/1000/g;
    

    但在我把数据放入多维数组后,我不知道如何将逗号插入到字段中。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Gerhard    7 年前

    首先,有几个CSV模块可以轻松实现这一点,但在某些情况下,我知道人们无法访问或无法安装软件包。因此,如果是这样的话,这应该会有所帮助。

    如果我没有弄错的话,您正在尝试从CSV中写入字段,CSV中嵌入了逗号。如果是这种情况,这些嵌入的逗号字段周围应该有括号或引号,以确保它们不被视为CSV的逗号分隔字段。然后我们可以抓取CSV中的所有数据。在这种情况下,我们将有一个csv,它使用括号、引号和两者来显示使用嵌入逗号的数据:

    显示CSV逗号:

    "Potatoes 1,000", (Tomatoes, 200), "(GemSquash, 1,029.95)"
                    ^                ^
    

    这些是嵌入的逗号:

    "Potatoes 1,000", (Tomatoes, 200), "(GemSquash, 1,029.95)"
               ^               ^                  ^  ^
    

    因此,下面将使用括号和双引号搜索和替换数据,以确定哪些是csv逗号,哪些是嵌入的。

    use strict;
    use warnings;
    
    my $string = '(Potatoes 1,000), "Tomatoes, 200", "(GemSquash, 1,029.95)"';
    my $query = qr/(?: "\( ( [^()""]* ) \)" |  \( ( [^()]* ) \) |  " ( [^"]* ) " |  ( [^,]* ) ) , \s* /x;
    my @results = grep defined, "$string," =~ /$query/g;
    print "$_\n" for @results;
    

    结果

    Potatoes 1,000
    Tomatoes, 200
    GemSquash, 1,029.95
    
        2
  •  -2
  •   shawnhcorey    7 年前

    要解析CSV,请使用CPAN模块,如 Text::CSV . 您可以对返回的值使用正则表达式。