非常简单的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以及如何编写它。
- 每个下一个string(
/r/n
)是下一个“表”行。 - “表格”单元格由一些分隔符号分隔。 最经常使用的符号是
\t
或,
- 每个单元格都可能包含此分隔符号(单元格必须以引号符号开始,并以此符号结束)
- 每个单元格可能包含
/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