2016-07-08 106 views
0

我發現許多關於CSV文件的問題,但沒有涉及正常的ASCII文件(.dat)文件。獲取ASCII文件中的列數

假設我有一個子程序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 
+1

你的意思是每行有多少個字符?你能提供一個示例輸入/輸出嗎? – xxfelixxx

+0

修改'writeMyFile'以添加列數作爲文件的第一行? – Borodin

+0

@xxfelixxx對不起,你是對的!我添加了2個虛擬示例。我假設該文件已完全填充(因此在較低行中沒有缺少測量值),並且可能一個空文件應該返回'0'或'undef' –

回答

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()行 - 但沒有更多信息,我們不可能知道您需要哪些內容。

+0

感謝您的回答! 我在原始問題中提供了一些虛擬示例。 我們可以假定文件是完全填充的(所以在下面的行中沒有缺少測量值),並且空文件應該返回'0','undef'或類似的東西 –

+0

好吧,它看起來像我的猜測在你的格式是正確的。所以基於我的代碼的東西將工作。很高興我能幫上忙。 –

+0

只是一個後續問題。如果文件具有前導空格會怎麼樣?在這種情況下,正則表達式會認爲文件中有一個額外的字符,我正確嗎?有沒有簡單的方法來克服這種邊緣情況? –

0

plotVals()讀取文件,根據數據文件中使用的任何分隔符分隔每行,並計算您獲得的字段數。我認爲你必須分割線來繪製各個數據點,除非你打電話給外部工具進行繪圖。如果您打電話給繪圖的外部工具,那麼讀取一個代表性的行(第一行?)就足夠了,然後對這些行進行計數。

或者將數據或某些元數據(列數)直接傳遞給plotVals()