2012-08-28 2 views
0

CSV 파일을 읽을 수있는 형식으로 변환하는 작은 응용 프로그램을 개발하기 위해 C#을 사용하고 있습니다.csv (",")에 대한 CSV 읽기가 실패하여 한 줄로 된 결과

다음은 CSV 샘플의이 같은 300 개 회선을 통해

"Symbol","Date","Expiry","Strike Price","Open","High","Low","Close","LTP" 
"5000","6000","4500","45855" ............ 

파일입니다.

public List<string[]> parseCSV(string path) 
{ 
    List<string[]> parsedData = new List<string[]>(); 

    try 
    { 
    using (StreamReader readFile = new StreamReader(path)) 
    { 
     string line; 
     string[] row; 

     while ((line = readFile.ReadLine()) != null) 
     { 
     row = line.Split(','); // <<< this ',' is not working 
     parsedData.Add(row); 
     } 
    } 
    } 
    catch (Exception e) 
    { 
    MessageBox.Show(e.Message); 
    } 

    return parsedData; 
} 

데이터에 따르면, 나는 LTP에 새로운 라인을 가야하지만, 일이 내가 한 줄과 같은 결과를 얻고보다는보다 더 아니에요. parseData를 추가하면 단일 행으로 표시됩니다.

+5

[자신 만의 CSV 파서 중지!] (http://secretgeek.net/csv_trouble.asp) – Reniuz

+1

휠체어를 재발 명하면 안되며, 다음과 같이 기존 csv-parser 중 하나를 사용하십시오. http : // www. codeproject.com/Articles/9258/A-Fast-CSV-Reader –

+1

다른 사람들이 FileHelpers와 같은 타사 프레임 워크를 사용해야한다고 말했기 때문에 – Kane

답변

2

다른 사람들은 자신의 CSV 파서를 굴리기가 어렵고 오류가 발생하기 쉽다고 말했기 때문에. 예상대로

using System; 
using FileHelpers; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     public static void Main() 
     { 
      /* 
      Sample data from TestData.csv 
       "Symbol","Date","Expiry","StrikePrice","Open","High","Low","Close" 
       "MSF","20090913","03032012","1.233","1.1","14.54","0.07","14.11" 
       "APL","20111225","31122011","30.09","31.1","33.33","29.11","33.13" 
      */ 

      var engine = new FileHelperEngine<StockModel>(); 
      engine.Options.IgnoreFirstLines = 1; // skip the header line 

      StockModel[] stocks = engine.ReadFile(@"TestData.csv"); 

      Console.Read(); 

     } 
    } 

    [DelimitedRecord(",")] 
    public class StockModel 
    { 
     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     public string Symbol; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
     public DateTime Date; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
     public DateTime Expiry; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Decimal, ".")] 
     public decimal StrikePrice; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Decimal, ".")] 
     public decimal Open; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Decimal, ".")] 
     public decimal High; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Decimal, ".")] 
     public decimal Low; 

     [FieldQuoted('"', QuoteMode.AlwaysQuoted)] 
     [FieldConverter(ConverterKind.Decimal, ".")] 
     public decimal Close; 
    } 
} 
+0

대단히 감사합니다. 실제로 보여 드린 예제는 인도 주식 시장 NSE 데이터를 사용하고 있습니다. 나는 파일 도우미를 사용할 것이다. – Vishwa

+0

나는 여기에 몇 가지 erro를 말하고있다. "양수가 필요하다. 매개 변수 이름 : 길이 1"이것은 무엇입니까 ?? – Vishwa

-2

귀하의 코드가 작동 : 내 개인적인 취향은 얼마나 좋은 쉽게 그것이 내가 당신의 데이터로 작업 예제를 포함했다 당신을 표시하고 FileHelpers 라이브러리로 자리 잡고 있습니다. 복사/붙여 넣기 만하면 각 줄마다 하나씩 두 개의 요소가 포함 된 목록이 반환됩니다. 각 요소는 문자열 배열이며 첫 번째 요소는 두 번째 요소 9 개를가집니다.

"바퀴 재발 명 중지"에 대해서는 개인적으로 동의하지 않습니다. CSV 파일을 파싱하는 것은 간단한 과정이므로 한 줄씩 읽고 .Split(delimiter)으로 전화하면됩니다. 이와 같은 간단한 프로세스에 특정 라이브러리가 필요한 경우 모든 프로젝트에 500 개 이상의 종속성이 있습니다.

다중 구분 기호, 비동기 구문 분석 또는 자신의 코드에서 아직 지원되지 않은 특별한 요구 사항이 없다면 lib를 사용하지 않을 것입니다.

lib를 사용하면 코드, 이식성, 버그 등을 소유하지 않기 때문에 라이센스 문제, 테스트 가능성, 자주 확장되지 않는 코드의 확장 성 등 프로젝트에서 발생할 수있는 많은 문제가 있음을 기억하십시오.

+0

당신이 옳습니다. 이 포럼은 도움을주고 해결책을 제공하는 것입니다. 어떻게 답변을 얻었 는가? ","나는 ""사용했다. 나를 위해 일했다. – Vishwa

+0

나는 정말 잊고 잊어 버리는 downvotes가있다. 코멘트를 남겨서 적어도 설명하십시오 ... – ken2k