使用单元格内的新行字符读取CSV

时间:2013-10-04 13:56:22

标签: c# csv

我正在尝试从csv读取两列,行由';'分隔。

我正在使用stram.ReadLine方法,但问题是某些单元格的文本具有换行符号,因此,方法ReadLine将该单元格分解为其他几个单元格,如何避免这个 ?为了简化这个模型,假设我有一列有100行,但有些列内部有长文本和一些断行,如何将其修改为100行而不是更多?

StreamReader aFile = new StreamReader("C:\\dev\\csvReplacment\\szablonDE.csv");


            var dane = new List<string>();

            string line;

            while ((line = aFile.ReadLine()) != null)
            {
                dane.Add(line);
            }
            aFile.Close();

3 个答案:

答案 0 :(得分:1)

假设;标记了一行的结尾:

    // Build your final resulting list
    List<String> dane = new List<String>();

    // use StreamReader to read the file
    using (StreamReader sr = new StreamReader(ms))
    {
        // create a string builder that we can use to store each
        // line's contents until it's ready to be added to dane
        StringBuilder builder = new StringBuilder();
        // buffer char
        Char c;
        // read the stream character by character
        while (!sr.EndOfStream)
        {
            c = (Char)sr.Read();
            // if it's `;` it's the end of a row, so add it to
            // dane and reset the line's contents
            if (c == ';')
            {
                dane.Add(builder.ToString());
                builder.Clear();
            }
            // avoid reading in superfluous whitespace before we
            // begin reading a line
            else if (builder.Length == 0 && Char.IsWhiteSpace(c))
            {
                continue;
            }
            // concatenate the current character to our line
            else
            {
                builder.Append(c);
            }
        }
        // if there's a final row, add it to dane
        if (builder.Length > 0)
        {
            dane.Add(builder.ToString());
        }
    }

    // dane now contains each line's contents.

您可以对此进行优化并一次读取1024个字符并在其中搜索;,但这只是一个向您展示如何开始的原始示例。

答案 1 :(得分:1)

使用Nuget的现有CSV解析器。 &#34; CSVTools&#34;在Nuget(http://www.nuget.org/packages/CsvTools/)上处理这个并且非常快,支持绑定到强大的.NET类型以便于解析。

http://blogs.msdn.com/b/jmstall/archive/2012/03/24/opensource-csv-reader-on-nuget.aspx

用法是这样的:

var dt = DataAccess.DataTable.New.Read(@"c:\temp\test.csv"); 
foreach (Row row in dt.Rows())  { } 

答案 2 :(得分:0)

我建议您只使用一些现有的代码/ lib,而不是将其自己挤在一起

http://csvfile.codeplex.com/ http://www.codeproject.com/Articles/12170/FileHelpers-v2-0-Delimited-CSV-or-Fixed-Data-Impor

那里只有2个

我还建议使用ServiceStack.Text nuget https://www.nuget.org/packages/ServiceStack.Text/3.9.64