Perl:如何将文件行(CSV 文件)读入哈希键并将它们按升序排序然后将它们写出到新的排序 CSV 文件中

Perl : How to read file lines(CSV File) into Hash keys and sort them out into ascending order then write them out into new sorted CSV File

所以我正在处理这个 CSV 文件,但问题是 CSV 文件似乎是按返回的每一行的第一列排序的,而不是基于同一列中的任何其他列排序的 row.I 想将其逐行升序排序,而不仅仅是按第一列排序,以便对它们进行标准化。

CSV 文件的内容如下所示(您可以从此处下载 csv 文件https://www4.palmettogba.com/pdac_dmecs/searchProductClassificationResults.do?manufacturer=&codeDecision=&productName=&modelNumber=&classification=Surgical+Dressings

我的想法是将文件行(CSV 文件)读入哈希键并将它们按升序排序,然后将它们写出到新排序的 CSV 文件中。但我没有在 perl 上执行此操作的技能,我真的需要在 perl 上执行此操作,因为我制作了一个脚本,用于将 csv 文件转换为 tsv,然后转换为 HTML 但首先我想在处理之前对 csv 文件进行排序它。

我的想法是 将文件行读入哈希键 $HASH($line_contents) =1; 排序哈希键(foreach my $oneline (sort keys %HASH)) 在循环排序的键时,将键写出到新的排序 CSV 文件中。

#CHECK IF CSV FILE DOWNLOAD IS FINISHED
my $complete_download_flag = 0;

while($complete_download_flag == 0)
{
    my @download_directory = read_dir($download_dir_link);
    foreach my $downloaded_file (@download_directory)
    {
        if($downloaded_file =~ /\QProduct Classification List.csv\E/sgi)
        {
            $complete_download_flag = 1;
        }
    }
    sleep(5);
}
#SORTED CONTENTS OF CSV BEFORE CONVERSION function to put here
print "sORTING csv content...\n";

#CONVERT CSV TO TSV
print "Converting csv to tsv...\n";
my $csv = Text::CSV->new ({ binary => 1 });
my $tsv = Text::CSV->new ({ binary => 1, sep_char => "\t", eol => "\n"});

open my $infh,  "<:encoding(utf8)", "$download_dir_link/Product Classification List.csv";
open my $outfh, ">:encoding(utf8)", "Product Classification List.tsv";

while (my $row = $csv->getline ($infh))
{
    $tsv->print ($outfh, $row);
}
close($infh);
close($outfh);

my $tsv_content = "";
open(my $fh, '<', "Product Classification List.tsv");
while (<$fh>)
{
    $tsv_content = $tsv_content.$_;
}
close($fh);
print "Conversion complete! cleaning tsv content...\n";

(首先,当我使用您的 link 将数据导出为 CSV 时,保存的文件在顶部有几行额外的内容;接下来的所有内容都假定您删除了这些内容。)

多种方法:

因为这看起来像是一个没有多行记录的简单 CSV 文件,只需使用标准 sort(1) 实用程序对其进行排序,或者在 perl 中处理文件之前:

$ (head -1 "Product Classification List.csv"; sed "1d" "Product Classification List.csv" | sort) > sorted.csv

或者,使用常用的 Text::AutoCSV 将 CSV 转换为 TSV 并在 perl 中对所有内容进行排序(这也可以很容易地适应单行):

#!/usr/bin/env perl
use warnings;
use strict;
use Text::AutoCSV;

# Original CSV file and output TSV file are command-line arguments, not
# hard-coded.

Text::AutoCSV->new(in_file => $ARGV[0], encoding => "UTF-8", out_file
                   => $ARGV[1], out_sep_char => "\t", out_orderby => [
                   "PRODUCTNAME", "MANUFACTURERDISTRIBUTOR",
                   "MODELNUMBER"," HCPCSCODE", "EFFECTIVEBEGINDATE",
                   "EFFECTIVEENDDATE", "COMMENTS" ])->write;

或从命令行使用 csvkit 进行排序和转换:

$ csvsort "Product Classification List.csv" | csvformat -T > sorted.tsv