2017-05-13 2 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; 
} 

에 한줄 파싱 정보 다음

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

관련 문제