2012-01-04 13 views
2

私はtxtファイルからデータを読み取る方法を探しています。私は辞書リストまたはこのようなもののリストのsomekindで、最初のフィールドでのグループでそれらを取得する必要がデータ取得fom txtfile vb.net

0000  AAAAAA  BBBBBB CCCCCCCC 
0000  JJJJJJ  III  RRRRRR 
1111  XXXX  YYYYYYYY ZZZZZZZZ 
1111  WW   PPPPPPPP ZZZZZZZZ 
1111  XXXX  YYYYYYYY ZZZZZZZZ 
2222  XXXX  YYYYYYYY ZZZZZZZZ 
... 

:テキストファイルには、この種の構造(固定長フィールド)を持っています。この特定の例のためのソリューションは、次のようになります。

id(list): 0000,1111,2222..... 
(content)List: 0000 
    field1(list): AAAAAA,JJJJJJ 
    field2(list): BBBBBB,III 
    field3(list): CCCCCCCC,RRRRRR 
(content)List: 1111 
    field1(list): XXXX,WW,XXXX 
    field2(list): YYYYYYYY,PPPPPPPP,YYYYYYYY 
    field3(list): ZZZZZZZZ,ZZZZZZZZ,ZZZZZZZZ 
(content)List: 2222 
    field1(list): XXXX... 
    field2(list): YYYYYYYY... 
    field3(list): ZZZZZZZZ... 

は今、私は文字列のリスト(1行に1つずつ)に保存されている全体のTXTを持っています。

どうすればvbnetでこれを行うことができますか?あなたはこの問題に対するよりよいアプローチがあると思いますか?

あなたがキーとして最初の列で辞書を作成するためにLINQを使用することができ感謝し、幸せな新年持って

答えて

0

:あなたはLINQ(とあなたに精通していない場合

Dim fileName = "C:\Temp\Test.txt" 
Dim allLines = IO.File.ReadAllLines(fileName) 

Dim query = From line In allLines 
     Select Columns = Microsoft.VisualBasic.Split(line, vbTab) 
     Select ID = If(Columns.Count <> 0, Columns(0), " "), Values = Columns.Skip(1).ToList 
     Group By ID Into Group 
     Select ID, Group 

' create a Dictionary from the LINQ-Query ' 
Dim dict = query.ToDictionary(Function(grp) (grp.ID)) 
' iterate all Dictionary-Entries ' 
For Each entry In dict 
    Dim key = entry.Key ' f.e 0000 
    For Each grp In entry.Value.Group 
     Dim id = grp.ID ' f.e 0000 (can repeat how we see in your example) ' 
     Dim values As List(Of String) = grp.Values 
     ' f.e. (0) "AAAAAA" (1) "BBBBBB" (2) "CCCCCCCC" ' 
    Next 
Next 

.NET 4.0を使用しています)List(Of Tuple(Of String, List(Of String)))を使用することをお勧めします。複製は許可されているからです(辞書はオプションではありません)。


http://msdn.microsoft.com/en-us/library/system.tuple.aspx

Dim data = New List(Of Tuple(Of String, List(Of String))) 
For Each line In allLines 
    Dim Columns = Microsoft.VisualBasic.Split(line, vbTab) 
    Dim ID = If(Columns.Count <> 0, Columns(0), "[empty-line]") 
    data.Add(Tuple.Create(ID, Columns.ToList)) 
Next 
' iterate the collection and read values ' 
For Each item In data 
    Dim ID = item.Item1 
    Dim Columns = item.Item2 
Next 
編集
Dictionary(Of String, List(Of List(Of String)))作成

あなたは.NET 4.0を使用していないので、あなたはタプルを使用できない場合は、以下試してください "オールドスクール" アプローチ - 。 (私はこれまでのあなたの条件を少し誤解たので、他の方法とは違って)

それは、正確な望ましい結果を生成します。

Dim allLines = IO.File.ReadAllLines(fileName) 
Dim data As New Dictionary(Of String, List(Of List(Of String))) 
For Each line In allLines 
    Dim cols = line.Split(ControlChars.Tab) 
    Dim ID As String 
    If cols.Length <> 0 AndAlso cols(0).Length <> 0 Then 
     ID = cols(0) 
     If data.ContainsKey(ID) Then 
      Dim columnLists = data(ID) 
      For colIndex As Int32 = 1 To cols.Length - 1 'skip first(id)-column 
       If columnLists.Count >= colIndex Then 
        Dim columnList = columnLists(colIndex - 1) 
        columnList.Add(cols(colIndex)) 
       Else 
        Dim newColumnList As New List(Of String) 
        newColumnList.Add(cols(colIndex)) 
        columnLists.Add(newColumnList) 
       End If 
      Next 
     Else 
      Dim columnLists = New List(Of List(Of String)) 
      For colIndex As Int32 = 1 To cols.Length - 1 'skip first(id)-column 
       Dim newColumnList As New List(Of String) 
       newColumnList.Add(cols(colIndex)) 
       columnLists.Add(newColumnList) 
      Next 
      data.Add(ID, columnLists) 
     End If 
    End If 
Next 

あなたが値を読み取ることができます方法:

Dim idList = data.Keys ' List of all ID-Keys ' 
For Each id As String In idList 
    Dim content As List(Of List(Of String)) = data(id) 
    Dim field1List As List(Of String) = content(0)  ' AAAAAA,JJJJJJ 
    Dim field2List As List(Of String) = content(1)  ' BBBBBB,III 
    ' .... 
Next 
+0

いい音ですが、今はLINQを学習するのに十分な時間がありません。周りには道がありますか?ありがとうbtw –

+0

@bpSz:私は時間があれば、私は後で別のアプローチを見つけることを試みるでしょう。上でコンパイルしようとしましたか?期待どおりに動作しますか? –

+0

@bpsz:LINQ以外の方法で私の答えを編集しました。 –

0

StreamReaderを使用できます。 ID値:Trupleたりを作成する -

using(StreamReader r = new StreamReader("@C:\somefile.txt")) 
{ 
    while(!r.EndOfStream) 
    { 
     string line = r.ReadLine(); 
     string[] data = line.Split(new string[] { " " }); //use a seperator that is approriate 
     //constructor the dictionary yourself 
    } 
} 

編集:::次に、あなたの構造のためにあなたは辞書を持っているキー

たIDictionaryそして、この(申し訳ありませんそのC#ではなく、あなたがアイデアを得る)のような何かを@TimのようにIDにアクセスできない場合は、独自のタプルクラスを提案します。

ジェネリックではなく、何かできることがあれば、私はそれを示唆しています。

public class Tuple<T,Q,R> 
{ 
    public T First { get; set; } 
    public Q Second { get; set; } 
    public R Third { get; set; } 
} 
+0

-1 OPが彼の問題を解決するのにどのように役立つか分かりません。 –

+0

@TimSchmelter - 元の投稿によると、彼はテキストファイルを読む方法を探していました。彼は好きではないLINQの使用を提案しました。したがって、私はStreamReaderをファイルを読む別の方法として提案しました。格納の構成は、提案/ OPに基づいています。 –

+0

私はファイルを読むためにLINQを使用していない、私は常に 'IO.File.ReadAllLines'を使用していました。しかしそれとは別に、OPはファイルの読み込みに問題はありませんが、解釈と構造化には問題がありません。単純な「分割」は機能しません(OPが区切り文字がないと言った後はまったくありません)。 –