2017-09-22 9 views
1

テキストファイルをリストの辞書に変換したい。それを移入方法が異なるクラスであり、かつ以下れるc# - テキストファイルから辞書

public static Dictionary<string, List<string>> myLists = new Dictionary<string, List<string>>(); 

public void TextFileToDictionary2() 
    { 
     using (var sr = new StreamReader(File_Path)) 
     { 
      string line = null; 
      List<string> InputLineList = new List<string>(); 
      while ((line = sr.ReadLine()) != null) 
      { 
       InputLineList.Clear(); 

       // Slice Substrings 
       string AP = line.Substring(0, 7); 
       string Address = line.Substring(8, 45); 
       string JDate = line.Substring(54, 3); 
       string BMFline = line.Substring(57, 6); 
       string POD = line.Substring(68, 11); 
       string DateApok = line.Substring(79, 4); 
       string checkdigit1 = line.Substring(83, 1); 
       string poso = line.Substring(84, 9); 
       string checkdigit2 = line.Substring(93, 1); 
       string GDate = line.Substring(94, 8); 
       string AType = line.Substring(102, 2); 
       string NinPacket = line.Substring(106, 5); 

       // Construct List 
       InputLineList.Add(AP); 
       InputLineList.Add(Address); 
       InputLineList.Add(JDate); 
       InputLineList.Add(BMFline); 
       InputLineList.Add(POD); 
       InputLineList.Add(DateApok); 
       InputLineList.Add(checkdigit1); 
       InputLineList.Add(poso); 
       InputLineList.Add(checkdigit2); 
       InputLineList.Add(GDate); 
       InputLineList.Add(AType); 
       InputLineList.Add(NinPacket); 

       //Console.WriteLine(InputLineList[0] + InputLineList[1] + InputLineList[2]); 
       //BaseDict.niarxosfileadv.Add(POD, InputLineList); 
       BaseDict.myLists.Add(POD, InputLineList); 
       Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 


      } 
      Console.WriteLine("#"); 
      Console.WriteLine(BaseDict.myLists["70503490702"][0] + BaseDict.myLists["70503490702"][1] + BaseDict.myLists["70503490702"][2]); 
      Console.WriteLine(BaseDict.myLists["33221051805"][0] + BaseDict.myLists["33221051805"][1] + BaseDict.myLists["33221051805"][2]); 

      foreach (KeyValuePair<string, List<string>> kvp in BaseDict.myLists) 
      { 
       Console.WriteLine("#"); 
       Console.WriteLine(kvp.Key + "@" + kvp.Value[0] + kvp.Value[1]); 
       Console.WriteLine(kvp.Key + "@" + BaseDict.myLists[kvp.Key][0] + BaseDict.myLists[kvp.Key][1]); 
      } 
     } 
    } 

と入力ファイルは次のようになりますよう辞書は、その別のクラス、BaseDict、で宣言されています:

0000039#XXXXXX    25000YYYYYYY #1491505400010070503490702030750000078006201 
0000040#zzzzzz    21300FFFFFFF #1491487800010533221051805030720000245001201 

私の問題は、辞書が正しくロードされているように、それは、この声明に見えるdoesntのことです

BaseDict.myLists.Add(POD, InputLineList); 
Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 

は、キー値のペアに対して正しい結果を生成しますが、以下のもの(ハードコードされたキー、ループの後のもの)は、辞書に入力された最後のキーの値のみを返します。

+0

のリストよりも、いくつかのクラスを使用することも良いでしょう、あなたは確かにすべてのあなたのPODのされていますユニーク? – BugFinder

+0

string POD = line.Substring(68、11);この例では、私はいくつかの機密情報を削除するために行を編集したので、以下に示す2つのハードコードされた値: – onlyf

+0

70503490702、33221051805、それらは文字列POD = line.Substring ...によって生成されています。 – onlyf

答えて

3

各ループでリストを書き換えます。あなたは辞書

でデータの書き換えを防止するために、各ループ上の新しいリストを作成する必要がありますので、リストには、参照型であることは、むしろストリング

List<string> InputLineList; 
      while ((line = sr.ReadLine()) != null) 
     { 
      InputLineList = new List<string>(); 
      // InputLineList.Clear(); 

      // Slice Substrings 
      string AP = line.Substring(0, 7); 
      string Address = line.Substring(8, 45); 
      string JDate = line.Substring(54, 3); 
      string BMFline = line.Substring(57, 6); 
      string POD = line.Substring(68, 11); 
      string DateApok = line.Substring(79, 4); 
      string checkdigit1 = line.Substring(83, 1); 
      string poso = line.Substring(84, 9); 
      string checkdigit2 = line.Substring(93, 1); 
      string GDate = line.Substring(94, 8); 
      string AType = line.Substring(102, 2); 
      string NinPacket = line.Substring(106, 5); 

      // Construct List 
      InputLineList.Add(AP); 
      InputLineList.Add(Address); 
      InputLineList.Add(JDate); 
      InputLineList.Add(BMFline); 
      InputLineList.Add(POD); 
      InputLineList.Add(DateApok); 
      InputLineList.Add(checkdigit1); 
      InputLineList.Add(poso); 
      InputLineList.Add(checkdigit2); 
      InputLineList.Add(GDate); 
      InputLineList.Add(AType); 
      InputLineList.Add(NinPacket); 

      //Console.WriteLine(InputLineList[0] + InputLineList[1] + InputLineList[2]); 
      //BaseDict.niarxosfileadv.Add(POD, InputLineList); 
      BaseDict.myLists.Add(POD, InputLineList); 
      Console.WriteLine(BaseDict.myLists[POD][0] + BaseDict.myLists[POD][1] + BaseDict.myLists[POD][2]); 


     } 
     ... 
+0

ありがとうございました。 – onlyf

関連する問題