我发现了很多关于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
答案 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()
。