获取ASCII文件中的列数

时间:2016-07-08 07:42:33

标签: perl ascii

我发现了很多关于CSV文件的问题,但没有关于普通ASCII文件(.dat)文件的问题。

假设我有一个子程序sub writeMyFile($data),它在ASCII文件my_file.dat中写入不同的值。然后每列都是一个值,我想在另一个子例程sub plotVals()中绘制,但为此我需要知道my_file.dat的列数,这些列并不总是相同。

Perl中有一个简单易读的方法可以获得ASCII文件的列数my_file.dat

一些示例输入/输出将是(注意:文件可能有多行):

在:

(first line on my_data1.dat) -19922 233.3442    12312 0 0
(first line on my_data2.dat) 0 0 0

出:

(for my_data1.dat) 5
(for my_data2.dat) 3

2 个答案:

答案 0 :(得分:3)

您还没有真正给我们足够的细节,以便任何答案真正有用(例如,解释数据文件的格式会有很大的帮助)。

但是,让我们假设您有一个文件,其中字段由空格分隔 - 如下所示:

col1  col2 col3    col4   col5 col6 col7    col8

我们对这些列一无所知,只是它们被不同数量的空白区分开。

我们可以通常的方式打开文件。

my $file = 'my_file.dat';
open my $data_fh, '<', $file or die "Can't open $file: $!";

我们可以通常的方式依次从文件中读取每条记录。

while (<$data_fh>) {
  # Data is in $_. Let's remove the newline from the end.
  chomp;
  # Here we do other interesting stuff with the data...
}

可能有用的事情是分割记录,以便每个字段都存储在数组的单独元素中。这很简单split()

# By default, split() works on $_ and splits on whitespace, so this is
# equivalent to:
# my @data = split /\s+/, $_;
my @data = split;

现在我们回答你的问题。我们在@data中拥有所有价值观。但我们不知道有多少价值。幸运的是,Perl可以很容易地找出数组中的元素数量。我们只是将数组赋值给标量变量。

my $number_of_values = @data;

我认为这是您需要的所有信息。根据数据文件的实际格式,您可能需要以某种方式更改split()行 - 但如果没有更多信息,我们无法知道您需要的内容。

答案 1 :(得分:0)

plotVals()中读取文件时,在数据文件中使用的任何分隔符上拆分每一行,并计算得到的字段数。我认为你必须分开线来绘制各个数据点,除非你调用外部实用程序进行绘图。如果您调用外部实用程序进行绘图,那么只需读取一个代表性行(第一个?)并计算其中的字段就足够了。

或者将数据或某些元数据(列数)直接传递给plotVals()