2017-05-13 4 views
0

私は配列に格納したいtxtファイルを持っています。私はパイプ(|)が別のアイテムを格納することを示すので、私は単線で追加項目を持っているときに問題の解析を実行しています。リストへのtxtファイルの解析

 
Inv #  Date  term qty description   price Tax 
3221409:2017/01/12:215|10:WD2002:2TB Hard Drive:121.66:N|20:KG240S:240GB SSD:125.10:N|20:KG120S:120GB SSD:78.75:N 

私はまずファイルを開いて各要素をコンソールに表示しようとしています。配列の境界外にインデックスを取得しています。このファイルには、情報を提供したヘッダーがありません。 //このオブジェクトを使用すると、ファイルから読み込むことができます。 StreamReader streamReader = null;

 string lineData; 
     string[] lineElements; 

     if (File.Exists(path)) 
     { 
      Console.WriteLine("Woohoo file found"); 
      try 
      { 
       int invoice; 
       String invoicedate; 
       int term; 
       int qty; 
       string description; 
       Boolean tax; 


       streamReader = new StreamReader(path); 
       while (streamReader.Peek() > 0) 
       { 
        lineData = streamReader.ReadLine(); 
        var parts = lineData.Split('|'); 
        lineElements = parts.First().Split(':');       
        invoice = int.Parse(lineElements[0]); 
        invoicedate = (lineElements[1]); 
        term = int.Parse(lineElements[2]); 
        qty = int.Parse(lineElements[3]); 
        Console.WriteLine(invoice); 
        Console.WriteLine(invoicedate); 
        Console.WriteLine(term); 
        Console.WriteLine(qty); 



       } 
+0

コードを追加してください –

+0

ヘッダーが完全ではありません。数量と説明の間に別のものがなければなりません –

答えて

0

まず、次いで構造コンテンツを解析する方法

static InventoryData ParseInventoryData(string data) 
{ 
    var parts = data.Split('|'); 
    var headparts = parts.First().Split(':'); 
    var result = new InventoryData 
    { 
     Inv = headparts[0], 
     Date = DateTime.ParseExact(headparts[1], "yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture), 
     Term = headparts[2], 
     Articles = parts.Skip(1).Select(part => ParseInventoryArticle(part)).ToList(), 
    }; 
    return result; 
} 

static InventoryArticle ParseInventoryArticle(string data) 
{ 
    var parts = data.Split(':'); 
    var result = new InventoryArticle 
    { 
     Quantity = int.Parse(parts[0]), 
     Whatever = parts[1], 
     Description = parts[2], 
     Price = decimal.Parse(parts[3], System.Globalization.CultureInfo.InvariantCulture), 
     Tax = parts[4] == "Y", 
    }; 
    return result; 
} 

及び最終的に単一の行を解析する2つの方法が、情報

public class InventoryData 
{ 
    public string Inv { get; set; } 
    public DateTime Date { get; set; } 
    public string Term { get; set; } 
    public IList<InventoryArticle> Articles { get; set; } 
} 

public class InventoryArticle 
{ 
    public int Quantity { get; set; } 
    public string Whatever { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 
    public bool Tax { get; set; } 
} 

を保持することができる構造を定義ファイルの内容

string[] content = { 
    "Inv #  Date  term qty description   price Tax", 
    "3221409:2017/01/12:215|10:WD2002:2TB Hard Drive:121.66:N|20:KG240S:240GB SSD:125.10:N|20:KG120S:120GB SSD:78.75:N" }; 

var data = content 
    // skip the header row 
    .Skip(1) 
    // parse the content 
    .Select(row => ParseInventoryData(row)) 
    .ToList(); 
+0

回答ありがとうございます。ファイルにはヘッダーはありませんが、最初にファイルを解析してコンソールに書き込もうとしています。インデックスを取得することは、配列の範囲外です。以下は私のコードです。 – TOD