【问题标题】:How to pad CSV file missing columns如何填充 CSV 文件缺失的列
【发布时间】:2017-09-23 23:24:54
【问题描述】:

我对一些来自软件的 CSV 文件有疑问,我想用它来导入 PostgreSQL(函数 COPY FROM CSV)。问题是像这样缺少最后几列(标题的字母,值的数字,TAB 分隔符的_):

a_b_c_d
1_2_3_4
5_6_7       <- last column missing
8_9_0_1
2_6_7       <- last column missing

从 file.csv 复制 in_my_table 结果是: 错误:“d”列缺少数据

要导入的正确文件示例:

a_b_c_d
1_2_3_4
5_6_7_       <- null column but not missing
8_9_0_1
2_6_7_       <- null column but not missing

我的问题:在 bash / linux shell 中是否有一些命令可以添加 TAB 分隔符以制作包含所有列的正确 / 完整 / 填充的 csv 文件。

感谢您的帮助。

【问题讨论】:

  • 您可以将 csv 复制到一个列表中,然后将分隔数据插入到 my_table 中

标签: linux bash postgresql shell csv


【解决方案1】:

好吧,其实我发现了这个:

awk -F'\t' -v OFS='\t' 'NF=50' input.csv > output.csv 

其中 50 是 TAB + 1 的数量。

【讨论】:

  • 在 mac 上,使用 gawk(从 brew 安装)而不是内置的 awk
【解决方案2】:

对 linux 不太了解,但在 postgresql 中可以通过简单的命令轻松完成,例如

copy tableName from '/filepath/name.csv' delimiter '_' csv WITH NULL AS 'null';

【讨论】:

    【解决方案3】:

    Perl 有一个CSV 模块,可以方便地修复更复杂的 CSV 错误。在我的 Ubuntu 测试系统上,它是包 libtext-csv-perl 的一部分。

    这解决了你的问题:

    #! /usr/bin/perl
    use strict;
    use warnings;
    use Text::CSV;
    
    my $csv = Text::CSV->new ({ binary => 1, eol => $/, sep_char => '_' });
    
    open my $broken, '<', 'broken.csv';
    open my $fixed, '>', 'fixed.csv';
    
    while (my $row = $csv->getline ($broken)) {
      $#{$row} = 3;
      $csv->print ($fixed, $row);
    }
    

    如果您有一个制表符分隔的文件,请将sep_char 更改为"\t",并记住Perl 对待"\t"'\t' 的方式不同。

    【讨论】:

      【解决方案4】:

      Awk 对此很有用。

      awk -F"\t" '{     # Tell awk we are working with tabs
      if ($4 =="")      # If the last field is empty
          print $0"\t"  # print the whole line with a tab
      else
          print $0      # Otherwise just print the line
      }' your.csv  > your.fixed.csv 
      

      【讨论】:

        【解决方案5】:

        您可以结合使用 sed 和正则表达式:

        sed -r 's/^[0-9](_[0-9]){2}$/\0_/g' file.csv
        

        您只需将 _ 替换为分隔符 (\t)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-01
          • 2020-10-02
          • 2020-07-30
          • 1970-01-01
          • 1970-01-01
          • 2012-10-25
          相关资源
          最近更新 更多