【问题标题】:Convert csv data to specific format DYNAMIC将 csv 数据转换为特定格式 DYNAMIC
【发布时间】:2015-08-25 07:10:53
【问题描述】:

我将此前端 CSS 数据存储在网页中。这是文本文件中的数据。

secid,Initial_shares
002826,3777
0028262,3777
0028262,3777
0028262,3777
0028262,3777
0028262,3777

我需要将此文本文件转换为以下格式。有一次,我将其转换为以下格式,我将能够在前端显示它。下面这个格式用于在jqgrid中显示数据。

var secid =
            [
             "002826", "0028262", "0028262", "0028262", "0028262", "0028262"];
var Initial_shares =
        [
            "3777", "3777", "3777", "3777", "3777", "3777"1
        ];

为了将文本转换为上述格式,我使用了以下 perl 代码。请注意。这种转换是静态的。即它知道有多少列。在这种情况下,将有 2 列。 secid 和 Initial_shares。所以这里是静态代码

my @a=();
my @b=();

my @a1=();
my @b1=();

my @perl_array=();
my @filena = split(/\|/, $filename);

open (TXT, "<$filename") || die "Can't open $filename: $!\n";
while (my $line=<TXT>) {
    chomp($line);
    ($a2, $b2) = split /,/, $line;

    push @a,('"', "$a2", '"', ',');
    push @b,('"', "$b2", '"', ',');
}

splice @a,0,4; # this splice is used to remove the header name.
splice @b,0,4; # i.e. first row data- secid, Initial_shares

push @a1,"var secid=[@a]";
push @b1,"var Initial_shares=[@b]";

push @perl_array, "@a1; @b1";
close TXT;

@perl_array 将与我们一开始所期望的数据类型完全相似。我会将这个 perl 变量传输到前端进行显示。

在以下情况下我需要帮助。如果不是 2 列,而是 5 列怎么办。我们如何将相同的 csv 文件转换为前面提到的格式。它应该是动态的。有人能解释一下吗?

【问题讨论】:

  • 您需要自己尝试提出解决方案,然后我们可以根据需要提出适当的建议和更正。
  • @MattJacob- 同意,但我希望就如何处理它获得一些帮助。主要问题是创建数组。如您所见,我必须为每一列创建数组。如果我有 2 列,我必须创建像 a、b 和 a1、b1 这样的数组,然后使用 push。动态创建数组是一个问题。另外,我如何将数据动态推送到动态数组。
  • 哈希引用数组可能会更好地为您服务。使用 CSV 文件的第一行作为哈希键。 Text::CSV 模块可以很容易地为您做到这一点。此外,您的输出看起来像是 JavaScript 数组,因此我建议您使用 JSON 模块以避免编码问题。
  • @MattJacob-感谢您的方法。我会看看这些并相应地更新。

标签: arrays perl dynamic


【解决方案1】:

使用我给你的建议,我会这样做:

use strict;
use warnings;

use JSON;
use Text::CSV;

my $filename = '/path/to/file.csv';

my $csv = Text::CSV->new({ binary => 1 }) or die Text::CSV->error_diag;
open(my $fh, '<', $filename) or die $!;

$csv->column_names($csv->getline($fh));
my $data = $csv->getline_hr_all($fh);

close($fh);

for my $column ($csv->column_names) {
    my $json = encode_json([ map { $_->{$column} } @$data ]);
    print "var $column = $json;\n";
}

【讨论】:

  • 确实简洁明了。非常好。
  • @Matt Jacob- 非常感谢。 chris Doyle 的方法是在相同的代码上帮助我,提出像 tat 这样的解决方案真的值得称赞。马特有另一种方法。我开始学习和理解这两种方法。所以谢谢你们。
  • @all- 这个答案也是正确的。它给了我与 Chris doyle 提供的相同的结果。
【解决方案2】:

这里的想法是首先处理标题行,然后基于您可以创建映射到每个标题字段的数组哈希。下面是一个示例代码来演示。

    use strict;
    use warnings;
    use Data::Dumper;

    my %dynamic;
    my @fields = split(/,/,<DATA>);
    chomp(@fields);

    while(<DATA>){
      chomp();
      my @data_fields=split(/,/);
      for (my $i=0; $i<@fields; $i++){
        push(@{$dynamic{$fields[$i]}}, '"' . $data_fields[$i] . '"');
      }
    }

    my @data_array;
    foreach (@fields){
      push(@data_array, "var $_ = [" . join(',',@{$dynamic{$_}}) . "];");
    }

    print join("\n",@data_array), "\n";

    __DATA__
    secid,Initial_shares,columna,someothercolumn
    002826,3777,1,2
    0028262,3777,a,b
    0028262,3777,5,6
    0028262,3777,g,h
    0028262,3777,4,5
    0028262,3777,h,j

我已打印出最终数组的数据结构以显示其内容。

var secid = ["002826","0028262","0028262","0028262","0028262","0028262"];
var Initial_shares = ["3777","3777","3777","3777","3777","3777"];
var columna = ["1","a","5","g","4","h"];
var someothercolumn = ["2","b","6","h","5","j"];

这将根据您的 csv 输入动态扩展或收缩。

【讨论】:

  • 你是认真的吗?我需要很长时间才能弄清楚这件事。我真的泪流满面……你不知道此时这对我意味着什么。再次感谢。
  • 您应该在自己的环境中对其进行测试,以确保它按您的预期工作。请告诉我结果如何。
  • Dyle- 这段代码非常适合我已经存在的代码。谢谢。
  • 很高兴听到它为您工作。如果您的问题已得到解答,请不要忘记选中最适合您的答案旁边的勾号,将其标记为已回答。
  • 克里斯·多伊尔——我不知道。我现在就做
【解决方案3】:

这可以通过将文件读入数组并在输出中重新格式化来非常简单地完成

这个程序需要输入文件的路径作为命令行参数

use strict;
use warnings;

my @data;
while ( <> ) {
    my @row = /[^,\s]+/g;
    push @{ $data[$_] }, $row[$_] for 0 .. $#row;
}

for my $i ( 0 .. $#data ) {
    my $column = $data[$i];
    printf "var %s = [\n", shift @$column;
    printf "    %s\n", join ', ', map qq{"$_"}, @$column;
    print  "];\n";
}

输出

var secid = [
    "002826", "0028262", "0028262", "0028262", "0028262", "0028262"
];
var Initial_shares = [
    "3777", "3777", "3777", "3777", "3777", "3777"
];

【讨论】:

  • 只要您的值中没有空格或逗号... ;-)
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 2020-11-06
  • 2019-02-01
相关资源
最近更新 更多