在c#中读/写CSV /制表符分隔文件

我需要从CSV / Tab分隔文件中读取并从.net写入此类文件。

困难在于我不知道每个文件的结构,需要将cvs / tab文件写入数据表,FileHelpers库似乎不支持。

我已经使用OLEDB为Excel编写了它,但是无法真正看到为此编写选项卡文件的方法,因此将返回到库。

有人可以帮忙提出建议吗?

我使用过这个CsvReader ,它真的很棒且可配置。 它适用于各种字符串和分隔符的转义。 其他快速和肮脏的实现中的转移很差,但这个lib非常适合阅读。 如果需要,还可以使用一些额外的代码行添加缓存。

写作不受支持,但实现自己相当微不足道。 或者从这段代码中激励自己。

.NET附带一个名为TextFieldParser类的CSV / tab delminited文件解析器。

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx

它支持CSV文件的完整RFC和非常好的错误报告。

以下是几个CSV阅读器实现:

http://www.codeproject.com/KB/database/CsvReader.aspx

http://www.heikniemi.fi/jhlib/ (只是图书馆的一部分;也包括一个CSV编写器)

我怀疑有一种标准方法可以“自动”将CSV转换为DataTable或数据库,您必须编写代码来执行此操作。 怎么做是一个单独的问题。

您将在代码中创建数据表,并且(假设标题行)可以根据文件中的第一行创建列。 之后,只需读取文件并根据其中的数据创建新行即可。

你可以使用这样的东西:

DataTable Tbl = new DataTable(); using(StreamReader sr = new StreamReader(path)) { int count = 0; string headerRow = sr.Read(); string[] headers = headerRow.split("\t") //Or "," foreach(string h in headers) { DataColumn dc = new DataColumn(h); Tbl.Columns.Add(dc); count++; } while(sr.Peek()) { string data = sr.Read(); string[] cells = data.Split("\t") DataRow row = new DataRow(); foreach(string c in cells) { row.Columns.Add(c); } Tbl.Rows.Add(row); } } 

上面的代码尚未编译,因此可能会有一些错误,但它应该让您走上正确的轨道。

您可以读写csv文件..这可能对您有所帮助。

将split char传递给此参数“serparationChar”

示例: –

  private DataTable dataTable = null; private bool IsHeader = true; private string headerLine = string.Empty; private List AllLines = new List(); private StringBuilder sb = new StringBuilder(); private char seprateChar = ','; public DataTable ReadCSV(string path, bool IsReadHeader, char serparationChar) { seprateChar = serparationChar; IsHeader = IsReadHeader; using (StreamReader sr = new StreamReader(path,Encoding.Default)) { while (!sr.EndOfStream) { AllLines.Add( sr.ReadLine()); } createTemplate(AllLines); } return dataTable; } public void WriteCSV(string path,DataTable dtable,char serparationChar) { AllLines = new List(); seprateChar = serparationChar; List StableHeadrs = new List(); int colCount = 0; using (StreamWriter sw = new StreamWriter(path)) { foreach (DataColumn col in dtable.Columns) { sb.Append(col.ColumnName); if(dataTable.Columns.Count-1 > colCount) sb.Append(seprateChar); colCount++; } AllLines.Add(sb.ToString()); for (int i = 0; i < dtable.Rows.Count; i++) { sb.Clear(); for (int j = 0; j < dtable.Columns.Count; j++) { sb.Append(Convert.ToString(dtable.Rows[i][j])); if (dataTable.Columns.Count - 1 > j) sb.Append(seprateChar); } AllLines.Add(sb.ToString()); } foreach (string dataline in AllLines) { sw.WriteLine(dataline); } } } private DataTable createTemplate(List lines) { List headers = new List(); dataTable = new DataTable(); if (lines.Count > 0) { string[] argHeaders = null; for (int i = 0; i < lines.Count; i++) { if (i > 0) { DataRow newRow = dataTable.NewRow(); // others add to rows string[] argLines = lines[i].Split(seprateChar); for (int b = 0; b < argLines.Length; b++) { newRow[b] = argLines[b]; } dataTable.Rows.Add(newRow); } else { // header add to columns argHeaders = lines[0].Split(seprateChar); foreach (string c in argHeaders) { DataColumn column = new DataColumn(c, typeof(string)); dataTable.Columns.Add(column); } } } } return dataTable; } 

我找到了最好的解决方案

http://www.codeproject.com/Articles/415732/Reading-and-Writing-CSV-Files-in-Csharp

只是我不得不重写

 void ReadTest() { // Read sample data from CSV file using (CsvFileReader reader = new CsvFileReader("ReadTest.csv")) { CsvRow row = new CsvRow(); while (reader.ReadRow(row)) { foreach (string s in row) { Console.Write(s); Console.Write(" "); } Console.WriteLine(); row = new CsvRow(); //this line added } } } 

CsvHelper的简单示例

 using (TextWriter writer = new StreamWriter(filePath) { var csvWriter = new CsvWriter(writer); csvWriter.Configuration.Delimiter = "\t"; csvWriter.Configuration.Encoding = Encoding.UTF8; csvWriter.WriteRecords(exportRecords); }