2012-08-28 51 views
0

我正在使用C#开发一个小型应用程序,它将csv文件转换为可读格式。CSV阅读失败的csv(“,”),获得结果作为单行

下面是在CSV样品的文件

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

超过300行这样的。根据这些数据,我应该在LTP处换新行,但这并没有发生,并且超过了我作为单行得到的结果。如果添加列表,即parseData它显示为单行。

+5

[停止滚动您自己的CSV分析器!](http://secretgeek.net/csv_trouble.asp) – Reniuz

+1

您不应该重新发明轮子,使用现有的csv解析器之一像这样:http:// www。 codeproject.com/Articles/9258/A-Fast-CSV-Reader –

+1

正如其他人所说,你应该真的使用第三方框架,如FileHelpers – Kane

回答

2

正如其他人所说的那样,自己的CSV解析器很难并且容易出错。我个人的偏好在于与FileHelpers库,并告诉你如何好,易于它是我所包含数据的工作示例:

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

我在这里得到一些错误它告诉“正数需要。参数名称:长度1”这是什么? – Vishwa

-2

您的代码按预期工作。只需复制/粘贴它,它会返回一个包含2个元素的列表,每行一个元素。每个元素都是一个字符串数组,第一个元素有9个元素,第二个元素有4个。

关于“停止重新发明轮子”,我个人不同意。解析CSV文件是一个简单的过程,您只需逐行阅读并致电.Split(delimiter)即可。如果这样一个简单的过程需要一个特定的库,每个项目将有500多个依赖关系。

如果您没有特殊要求,例如多个分隔符,异步分析或任何您自己的代码不支持的特殊要求,我不会使用lib。

记住使用lib还会在项目中引入很多潜在的问题(许可问题,可测试性,代码的可扩展性,因为您不拥有代码,可移植性,错误等常常不重要)。

+0

你是对的。这是论坛是帮助和给予的解决方案。我怎么得到答案非常感谢你,而不是“,”我用“”,它为我工作 – Vishwa

+0

我真的很讨厌火灾和忘记downvotes。至少通过留言来解释...... – ken2k