非常简单的C#CSV阅读器

我想从CSV文件创build一个数组。

这是简单的,你可以想象,CSV文件将只有一行和这些值:

Device, SignalStrength, Location, Time, Age. 

我想把这些值放入一维数组中。

我已经尝试过一些例子,但是它们都比所需要的更复杂。

如果只有一条线,那就做这样的事情:

 using System; using System.IO; class Program { static void Main() { String[] values = File.ReadAllText(@"d:\test.csv").Split(','); } } 

你可以尝试一些像下面的LINQ代码片段。

 string[] allLines = File.ReadAllLines(@"E:\Temp\data.csv"); var query = from line in allLines let data = line.Split(',') select new { Device = data[0], SignalStrength = data[1], Location = data[2], Time = data[3], Age = Convert.ToInt16(data[4]) }; 

更新:在一段时间内,事物发展。 截至目前,我宁愿使用这个库http://www.aspnetperformance.com/post/LINQ-to-CSV-library.aspx

这是我做的一个简单的function。 它接受一个stringCSV行并返回一个字段数组:

它与Excel生成的CSV文件,以及许多其他变化效果很好。

  public static string[] ParseCsvRow(string r) { string[] c; string t; List<string> resp = new List<string>(); bool cont = false; string cs = ""; c = r.Split(new char[] { ',' }, StringSplitOptions.None); foreach (string y in c) { string x = y; if (cont) { // End of field if (x.EndsWith("\"")) { cs += "," + x.Substring(0, x.Length - 1); resp.Add(cs); cs = ""; cont = false; continue; } else { // Field still not ended cs += "," + x; continue; } } // Fully encapsulated with no comma within if (x.StartsWith("\"") && x.EndsWith("\"")) { if ((x.EndsWith("\"\"") && !x.EndsWith("\"\"\"")) && x != "\"\"") { cont = true; cs = x; continue; } resp.Add(x.Substring(1, x.Length - 2)); continue; } // Start of encapsulation but comma has split it into at least next field if (x.StartsWith("\"") && !x.EndsWith("\"")) { cont = true; cs += x.Substring(1); continue; } // Non encapsulated complete field resp.Add(x); } return resp.ToArray(); } 

这是我在一个项目中使用的,parsing一行数据。

  private string[] csvParser(string csv, char separator = ',') { List <string> = new <string>(); string[] temp = csv.Split(separator); int counter = 0; string data = string.Empty; while (counter < temp.Length) { data = temp[counter].Trim(); if (data.Trim().StartsWith("\"")) { bool isLast = false; while (!isLast && counter < temp.Length) { data += separator.ToString() + temp[counter + 1]; counter++; isLast = (temp[counter].Trim().EndsWith("\"")); } } parsed.Add(data); counter++; } return parsed.ToArray(); } 

http://zamirsblog.blogspot.com/2013/09/c-csv-parser-csvparser.html

上面这个固定版本的代码记住了CVS行的最后一个元素;-)

(使用具有5400行和26个元素的CSV文件进行testing)

  public static string[] CSVRowToStringArray(string r, char fieldSep = ',', char stringSep = '\"') { bool bolQuote = false; StringBuilder bld = new StringBuilder(); List<string> retAry = new List<string>(); foreach (char c in r.ToCharArray()) if ((c == fieldSep && !bolQuote)) { retAry.Add(bld.ToString()); bld.Clear(); } else if (c == stringSep) bolQuote = !bolQuote; else bld.Append(c); /* to solve the last element problem */ retAry.Add(bld.ToString()); /* added this line */ return retAry.ToArray(); } 

我的解决scheme处理报价,覆盖字段和string分隔符等。它是短而甜。

  public static string[] CSVRowToStringArray(string r, char fieldSep = ',', char stringSep = '\"') { bool bolQuote = false; StringBuilder bld = new StringBuilder(); List<string> retAry = new List<string>(); foreach (char c in r.ToCharArray()) if ((c == fieldSep && !bolQuote)) { retAry.Add(bld.ToString()); bld.Clear(); } else if (c == stringSep) bolQuote = !bolQuote; else bld.Append(c); return retAry.ToArray(); } 

首先需要了解什么是CSV以及如何编写它。

  1. 每个下一个string( /r/n )是下一个“表”行。
  2. “表格”单元格由一些分隔符号分隔。 最经常使用的符号是\t,
  3. 每个单元格都可能包含此分隔符号(单元格必须以引号符号开始,并以此符号结束)
  4. 每个单元格可能包含/r/n sybols(在这种情况下,单元格必须以引号符号开头并以此符号结尾)

前段时间我写了一个基于标准Microsoft.VisualBasic.FileIO库的CSV读写简单类。 使用这个简单的类,你将能够像使用2维数组一样使用CSV。

使用我的图书馆的简单例子:

 Csv csv = new Csv("\t");//delimiter symbol csv.FileOpen("c:\\file1.csv"); var row1Cell6Value = csv.Rows[0][5]; csv.AddRow("asdf","asdffffff","5") csv.FileSave("c:\\file2.csv"); 

你可以通过以下链接find我的课,并调查它是如何写的: https : //github.com/ukushu/DataExporter