首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将(键、值)数据转换为csv格式

将(键、值)数据转换为csv格式
EN

Stack Overflow用户
提问于 2016-07-19 22:15:38
回答 0查看 261关注 0票数 0

假设我们有一个数据文件,格式如下:

代码语言:javascript
运行
复制
$ cat data.txt
  a:23 b:25 c:76 d:45
  a:21 b:24 c:25 
  a:20 d:52 e:75 f:75 g:52
  ...
  (many lines)
  ...

假设此文件太大,无法读取到内存中,那么将此数据转换为csv格式的最快方法是什么?

输出应该包含一个标头,其中包含文件中所有可能的“键”;如果某一行缺少特定的键,那么该行上的键的值应该等于零。例如:

代码语言:javascript
运行
复制
$ cat csv.txt
//a,b,c,d,e,f,g
23,25,76,45,0,0,0
21,24,25,0,0,0,0
20,0,0,52,75,75,52
... 
(many lines)
... 

这是我尝试过的。它起作用了,但我感觉所有的循环都在减慢我的速度。有没有一种更快、更优化的方法来做到这一点?我使用的是Perl,但我当然愿意切换到Python或其他东西。

代码语言:javascript
运行
复制
# transform_test.pl 

# build set of all used keys.
my %usedKey;
open FILE, "data.txt";
while(<FILE>) {
        chomp $_;
        my @fields = split;
        foreach my $field (@fields) {
                my ($key,$value) = split(":",$field);
                $usedKey{$key} = 1;
        }
}
close FILE;

# build array of all used keys, but sorted.
my @sorted_keys = sort keys %usedKey;

# print header
my $header = "//";
foreach my $key (@sorted_keys) { $header .= "$key,"; }
chop $header;
print "$header\n";

# read through file again to transform the data;
open FILE, "data.txt";
while(<FILE>) {
        chomp $_;

        # build current line hash
        my @fields = split;
        my %currentData;
        foreach my $field (@fields) {
                my ($key,$value) = split(":",$field);
                $currentData{$key} = $value;
        }

        # build string by looping over all sorted keys.
        my $toPrint = "";
        foreach my $key (@sorted_keys) {
                $toPrint .= defined $currentData{$key} ? "$currentData{$key}," : "0,"; 
        }
        chop $toPrint;
        print "$toPrint\n";
}
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38461066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档