2013-07-23 29 views
0

我有在下列格式的行製表符分隔文本文件:使用LINQ to得到製表符分隔文本文件中的字符串轉換的方式數組我想

I000001 \ t I000002 \ t 「等等等等等等。胡說。等等等等」

我想每行每分裂選項卡上,所以上述線路將被分爲三個部分

我已經能夠分裂當沒有空格或引用時,每行都按需要,但是我很困難有。

這裏就是我具有類似於上述的線嘗試:

var x = from lines in data 
     .Where(l => !string.IsNullOrEmpty(l)) 
     .Select(l => l.Split('\t')) 
     select new 
     { 
     A = lines[0].Trim(), 
     B = lines[1].Trim(), 
     C = lines[2].Trim() 
     }; 

上面產生帶有索引的陣列[0],[1],[2]。每個索引都有三個由上述字符串組成的成員(見下圖)。它應該只有一個索引和三個成員。

enter image description here

通知所述陣列中的第一項如何,有三個要素。數組中還有兩個項目在第一個項目的下面。它們都有3個元素,這三個元素包含了用雙引號括起來的字符串的其餘部分。

解決方案:

按照選定的答案,有一個在裏面語錄一句多餘的標籤,導致額外的項目被添加到陣列中。爲了解決這個我用一個正則表達式,改編自this answer

line = Regex.Replace(line, @"""[^""]+""", m => m.Value.Replace('\t', ' ')); 
+1

不太清楚你的問題是什麼......你能解釋一下嗎? –

+0

我假設你很困惑,因爲調試器窗口顯示「I000001」,但它只是表示它是一個字符串。其實它是'I000001'。 –

+1

真的嗎?我想我解釋得很好。雙引號內的字符串被分成幾個部分,在數組中創建比應該多的對象。雙引號(或第三個選項卡)中的字符串應僅位於索引[2]處,完整。 – MattSull

回答

1

如果您使用的是Split('\t'),則會在每個選項卡標記上進行拆分...因此,如果您的文本行按照您所說的拆分,那麼它們必須在其中包含選項卡標記(在「 「 分數)。請檢查這個...如果你這樣做,你可以使用一個正則表達式去除之前出現在你運行Linq查詢之前內的標籤標記。

+0

你說得對。文本的行可能原本在段落中,導致額外的標籤?手動刪除它可以根據需要工作,但我將使用正則表達式來刪除引號內的任何內容。 – MattSull

+0

爲了完整性,使用正則表達式編輯您的答案。 – MattSull

+0

@ MattSull87,你的編輯被幾個版主拒絕改變答案的含義或者什麼......也許你應該將你的Regex添加到你的問題的結尾呢? – Sheridan

2

使用Microsoft.VisualBasic.FileIo.TextfieldParser和分隔符設置爲\t

這實際上是一個很常見的問題,但人們通常會詢問逗號而不是製表符。

+0

嘗試了'TextFieldParser',但我得到了同樣的結果。 – MattSull

+0

@ MattSull87 - 您是否設置了HasFieldsEnclosedInQuotes屬性? –

0

我建議使用此代碼:

var data = new[] {"I000001 \t I000002 \t \"Blah blah blah. Blah. Blah Blah\""}; 

var x = from lines in data 
     select (from s in lines.Split('\t') 
      where !string.IsNullOrEmpty(s) 
      select s.Trim()) 
     .ToArray(); 

在這個例子中,只有一個製表符分隔的字符串,但如果你在輸入數組有更多的人,x是字符串數組的枚舉,由製表符分隔的子項目組成。

相關問題