【问题标题】:Output particular sections of txt file to csv?将txt文件的特定部分输出到csv?
【发布时间】:2013-04-01 01:01:17
【问题描述】:

假设我有一个如下所示的 txt 文件(它显然不是“文本文本”,我只是表明它是不相关的文本块)

text text text
text text text 
text text text 
important section age=30
name=mike
text text text 
text text text 
text text text

我想解析它并仅将“重要部分”输出到 csv,以便我的 csv 如下所示,即一列中的年龄和另一列中的名称

age    name
30     mike

我应该怎么做?珀尔?赛德?我对这两个都不太熟悉,但希望有一个足够简单的解决方案。

Churoba 实际上为我完美地回答了上述问题,但我担心我过于简化了我的实际文本文件,它更像是下面

Something:
 this
Something else:
 that
Something else:
 etc.
Sales 
2011 Sales:
 €3,000

()
2010 Sales:
 €2,000

()
2011 Growth Rate:
 50.00%

Contact Details

我最理想的输出是

2011 Sales    2010 Sales    2011 Growth Rate
3,000         2,000         50.00%

不幸的是,这使事情变得非常复杂。输出不必与上面完全相同,但尽可能接近

【问题讨论】:

  • 那么,您如何判断什么是有意义的行 - 是因为它以年份开头吗?还是因为它末尾有一个冒号?所有带有欧元符号的行都有意义吗?他们面前总是只有一个空间吗?在你写任何东西之前,你至少需要有一些规则,这样你和代码才能确切地知道你对什么感兴趣
  • 编辑后的示例本质上是我要解析的文件的镜像,所以我知道我需要关注“销售”和“联系方式”之间的所有文本。然后我需要为“2011 Sales”创建列(并在其下方的行中包含 3,000),为“2010 Sales”创建列(在下方的一行中包含 2,000)等等。

标签: perl parsing csv sed


【解决方案1】:

Perl 解决方案。它保留一个标志,告诉我们是否在重要部分。所有重要的东西都被记录在一个数组中并在最后打印出来:

perl -nE '$i = 1 if s/important section //;
          push @t, [$1, $2] if $i and /(.*)=(.*)/;
          }{
          for my $i (0, 1) {
              say join "\t", map $_->[$i], @t
          }' file.txt

【讨论】:

  • 快速回答,谢谢 choroba!这非常适合我在这里给出的示例,但我的实际 txt 文件要复杂得多。知道如何更改它以适用于我拥有的实际 txt 文件吗?
  • @choroba +1,干净而惯用。 -E 在那里启用say 吗?
  • @robocode 除非您对文件格式更准确,否则不会...请用更能代表您实际输入的示例更新您的问题。
  • @AdrianFrühwirth:是的,-E 在支持它的 Perls 上启用了 say
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2022-11-22
  • 2022-11-23
  • 2019-08-17
  • 2015-06-10
  • 2016-08-02
相关资源
最近更新 更多