2012-04-13 50 views
1

我經常與像這樣(在R兼容性)文件處理:是否有一個從文件中讀取命名列的C++庫?

# comments 
# more comments 
col1 col2 col3 
1 a hi 
2 b there 
. . . 

很多時候,我會想讀COL2爲載體或其它容器。編寫一個解析這種文件的函數並不難,但如果沒有經過良好測試的庫來爲我做這件事,我會感到驚訝。這樣的圖書館是否存在? (正如我所說,自己推出並不困難,但由於我不是C++專家,因此使用模板可能會讓我使用任意容器來容納任意數據類型,這對我來說會有些麻煩。)

編輯: 我知道我想要的列的名稱,但不是這個特定文件中的列的順序。列之間用未知數量的空白區分開,可能是製表符或空格(可能不是兩個)。每行的第一個條目可能有也可能沒有空白,有時在一個文件內會改變,例如,

number letter 
8 g 
9 h 
10 i 
+0

將文件另存爲CSV並使用CSV解析器? – garbagecollector 2012-04-13 16:42:28

+0

檔案有多大?雖然這不是特別困難,但很難找到一個非常緩慢的解決方案。 – 2012-04-13 16:43:10

+0

最常見的100-1000行。其中最大的是約1000萬行。我並不十分關心性能和開發週期。 – flies 2012-04-13 16:52:45

回答

2

提升split可以做你想做的事情,只要你能持續地分割空白。

+0

列將由空白(可變長度,空格和/或製表符)分隔。分裂不是太難 - http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c – flies 2012-04-13 17:16:49

+0

這也是一個可行的選擇。遍歷每行,並在空白處「分割」,然後將結果列表放入一個2d數組中。然後你可以運行2d數組,從正確的列中選擇你想要的項目。 – 2012-04-13 17:40:59

2

我不知道任何C++庫會這樣做。然而,一個簡單的解決方案是使用linux cut。你必須先刪除評論,這是很容易與SED完成:

sed -e '/^#/d' <your_file> 

然後,你可以應用下面的命令,它會選擇剛剛從第三列文:

cut -d' ' -f3 <your_file> 

你可以與管道結合在一起的,以使其成爲一個單一的命令:

sed -e '/^#/d' <your_file> | cut -d' ' -f3 <your_file> 

您可以以編程方式運行此命令,則僅簡單地追加每行一個STL容器。

// pseudocode 
while(file.hasNextLine()) 
{ 
    container << file.readNextLine(); 
} 

對於如何實際運行從內部代碼cut,看到this answer

+0

看起來像你' d必須首先解析文件以刪除註釋和標題聲明列名稱,然後管理結果以剪切。 – flies 2012-04-13 17:05:00

+0

@flies我已經更新了我的回答以解釋評論 – 2012-04-13 17:38:23

+0

有沒有辦法讓'cut'分隔符成爲由製表符和/或空格組成的可變長度的空格?它會處理以空白開頭的行嗎? 'perl -e'while(<>){next if/^#/;終日啃食;打印((分割)[1],「\ n」); }''會給我一個排除註釋的文件中的第二列,但是我沒有看到任何這種在C++中讀取和分割的優點。 – flies 2012-04-13 18:16:59

相關問題