2008-08-13 236 views
3

我看的分隔字符串解析?

A,B的順序解析分隔的字符串,東西,C

但是,這是一個很簡單的例子,和解析分隔的數據可能會很複雜;例如

1, 「你簡單的算法,它失敗」,真

會打擊你的naiive string.Split實施位。有什麼我可以自由使用/竊取/複製和粘貼,爲解析分隔文本提供了一個相對簡單的解決方案? .NET,plox。

更新:我決定去與TextFieldParser,這是VB.NET的一堆隱藏在Microsoft.VisualBasic.DLL的好東西的一部分。

回答

4

我用這從一個文件

string filename = @textBox1.Text; 
string[] fields; 
string[] delimiter = new string[] {"|"}; 
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser = 
     new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) { 
    parser.Delimiters = delimiter; 
    parser.HasFieldsEnclosedInQuotes = false; 

    while (!parser.EndOfData) { 
     fields = parser.ReadFields(); 
     //Do what you need 
    } 
} 

閱讀我相信有人在這裏可以改變這解析器字符串,它是在內存中。

0

我在考慮一個通用框架需要指定兩件事情: 1.什麼是分隔字符。 2.在什麼情況下,這些字符不會被計數(例如當它們在引號之間時)。

我覺得在每次你需要做這樣的事情時,編寫自定義邏輯可能會更好。

2

我不知道任何框架的,但一個簡單的狀態機工作原理:

  • 狀態1:讀每一個字符,直到你打一個「或,
    • 在情況下」:移動到狀態2
    • 在的情況下,:移動到狀態3
    • 在文件的末尾的情況下:移動到狀態4
  • 狀態2:讀每一個字符,直到你打一個「
    • 在的情況下」:移動到狀態1
    • 在文件末尾的情況:要麼移到國家4或信號,因爲一個錯誤一個未終止的字符串
  • 狀態3:當前緩衝區添加到輸出數組,向前移動光標後面,並返回到狀態1
  • 狀態4:這是最終狀態,什麼也不做,除了返回輸出數組。
+0

CSV字符串可以包括文本引號內換行字符,所以你不能發出錯誤信號而在狀態2,如果行的末尾。 – cjk 2009-02-26 14:24:03

+0

實際上,我總是忘記可怕的\ n字符,它將大多數CSV解析器搞砸了。澄清。 – 2009-02-26 15:38:34

1

這裏有一些很好的答案:Split a string ignoring quoted sections

你可能想你的問題重新措辭的東西更精確(?如我可以使用代碼片段或庫在.NET解析CSV數據) 。

2

​​
+1

@ C1pher請不要進行風格編輯,如Java與C#/ Pascal包圍。 – StuartLC 2014-01-10 16:37:36

+0

同意。我試圖拒絕這個編輯,但它已被批准。 – 2014-01-10 16:44:13

+0

我想補充一點,我們不是K&R,也不是Linux內核開發。 FFS,夥計們。 – Stu 2014-01-10 20:11:00

0

簡單的方法是將字符串分割成一個字符數組,尋找您的字符串限定詞和分裂焦炭。

它應該是相對容易的單元測試。

您可以用類似於基本.Spilt方法的擴展方法來包裝它。

1

爲了做一個無恥的插件,我一直在研究一個名爲fotelo(格式化文本加載器)的庫,我用它來快速解析大量基於分隔符,位置或正則表達式的文本。對於一個快速的字符串來說它是過度殺毒,但如果你使用的是日誌或大量的數據,它可能正是你所需要的。它使用類似於SQL * Loader的控制文件模型(其背後的靈感來源)。