2017-03-09 272 views
0

這是我在stackoverflow上的第一個問題。我用Matlab使用textread讀取.txt文件時出現問題。 .txt真的很亂,有如下結構。Matlab:如何讀取具有多個分隔符的.txt文件

"ALMEMO";"BEREICH:";"L420";"DIGI";"DIGI";"DIGI";"DIGI";;;;;;;"DIGI";"DIGI";"DIGI";"DIGI";;;;;;;"DIGI";"DIGI";"DIGI";"DIGI";;;;;;;"DIGI";"DIGI";"DIGI";"DIGI";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"CoCo";"CoCo";"CoCo";"CoCo";"CuCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";;;;;;;;;;;"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo";"CoCo" 
"5690-2";"KOMMENTAR:";"";"T,t  ";"T,t  ";"Temperatur";"T,t  ";;;;;;;"RH,Uw  ";"RH,Uw  ";"Feuchte ";"RH,Uw  ";;;;;;;"DT,td  ";"DT,td  ";"Taupunkt ";"DT,td  ";;;;;;;"MH,r g/kg ";"MH,r g/kg ";"Mischung ";"MH,r g/kg ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"";"";"";"";"";"";"";"";"";"";;;;;;;;;;;"";"";"";"";"";"";"";"";"";"" 
"SD3.10";"GW-MAX:";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
"ALMEMO.001";"GW-MIN:";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
"DATUM:";"ZEIT:";"M00: ms";"M01: øC";"M02: øC";"M03: øC";"M04: øC";;;;;;;"M11: %H";"M12: %H";"M13: %H";"M14: %H";;;;;;;"M21: øC";"M22: øC";"M23: øC";"M24: øC";;;;;;;"M31: gk";"M32: gk";"M33: gk";"M34: gk";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"M70: øC";"M71: øC";"M72: øC";"M73: øC";"M74: øC";"M75: øC";"M76: øC";"M77: øC";"M78: øC";"M79: øC";;;;;;;;;;;"M90: øC";"M91: øC";"M92: øC";"M93: øC";"M94: øC";"M95: øC";"M96: øC";"M97: øC";"M98: øC";"M99: øC" 
07.03.21;11:29:24;0,;22,91;23,15;23,68;22,75;;;;;;;38,3;74,1;70,;38,8;;;;;;;8,;18,3;17,8;8,1;;;;;;;6,6;13,2;12,8;6,6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-;-;-;-;-;-;-;-;-;-;;;;;;;;;;;-;-;-;-;-;-;-;-;-;- 
;11:30:24;0,;22,9;23,14;23,69;22,82;;;;;;;38,4;72,6;71,9;38,5;;;;;;;8,;18,;18,3;8,;;;;;;;6,6;12,9;13,2;6,6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-;-;-;-;-;-;-;-;-;-;;;;;;;;;;;-;-;-;-;-;-;-;-;-;- 
;11:31:24;0,;22,94;23,14;23,68;22,88;;;;;;;38,3;75,4;71,5;38,5;;;;;;;8,;18,6;18,2;8,1;;;;;;;6,6;13,4;13,1;6,6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-;-;-;-;-;-;-;-;-;-;;;;;;;;;;;-;-;-;-;-;-;-;-;-;- 
;11:32:24;0,;23,;23,13;23,68;22,95;;;;;;;38,2;73,;72,3;38,5;;;;;;;8,;18,1;18,4;8,1;;;;;;;6,6;13,;13,3;6,7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-;-;-;-;-;-;-;-;-;-;;;;;;;;;;;-;-;-;-;-;-;-;-;-;- 

六行標題後面跟着實際的數據,用';'分隔。並使用逗號而不是點來格式化浮點數字。我需要的數據不是整行代表的,而只是前九個元素(日期,小時,9個浮點數)。

我寫讀取文件中的代碼,有點天真,看着其他代碼,如下:

[date1, hour1, V0, Temp1, Temp2, Temp3, Temp4, RH1, RH2, RH3, RH4] = textread('file.txt', '%c %c %f %f %f %f %f %c* %c* %c* %c* %c* %c* %f %f %f %f', 'headerlines', 7, 'delimiter', ';'); 

顯然這是行不通的。我認爲應該在我的代碼版本中跳過標題,因此,總結一下,以下問題仍然存在:

  • 我該如何將多個分隔符視爲一個? (或者忽略它們,就像我在代碼中試圖做的那樣)
  • 我怎樣才能讓日期出現在整個代碼中只出現在標題後面的第一行? (我想我可以填充輸出矩陣的第一列,然後用for循環)
  • 如何剪切文本文件的行,忽略第九個浮點數之後的所有內容? - 如何讀取彗星分離的浮點數? (我想將它們轉換爲用記事本點「替換」功能,這是我的情況下,一個有效的解決方案,但仍然不能解決問題)提前

謝謝大家誰都會回答,照顧, Giuseppe

+0

我不知道MATLAB是否有足夠的靈活性來解析這樣的文件。如果您事先使用其他語言(如PERL)來編輯文件,可能會更好。 – UJIN

+2

你應該閱讀'textscan'的幫助。特別是'MultipleDelimitersAsOne'和'HeaderLines'選項 – Suever

+0

如果你把整個文件看作一個字符串,你可以考慮使用regexprep(strFile,'+;',';')來後處理這個字符串來替換多個匹配項。與一個單一。你可以用''替換','。使用regexprep並逐步獲取您想要的最終數據表示形式 –

回答

0

您可以利用textscan的內置參數來正確處理標題行並解析出多個分隔符。然後用strrep處理點替換的逗號。最後,你可以將你的單元格數組轉換成一個數字數組,其編號爲str2double

fid = fopen('foo.txt'); 
C = textscan(fid, repmat('%s',1,9), 'Headerlines', 6, 'Delimiter', ';', 'MultipleDelimitersAsOne', 1); 
col1 = str2double(strrep(C{1}, ',', '.')); 

非常迂迴的完成任務的方式,但文本處理並不完全是matlab的強項。

相關問題