Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中编写CSV文件_C#_.net_Csv - Fatal编程技术网

C# 在.net中编写CSV文件

C# 在.net中编写CSV文件,c#,.net,csv,C#,.net,Csv,我需要将数据集导出为CSV文件 我花了一段时间搜索一组规则,发现在编写CSV文件时有很多规则和异常 所以现在这不是一个简单的用逗号分隔字符串的过程,我已经搜索了一个现有的CSV编写器,它可以是第三方的,也可以是.net framework中包含的(希望是!) 编辑:新链接: TextFieldParser是一个VB对象(可以从C#中引用),它将自动解析CSV文件: 我想知道是否有人知道任何方便的.Net(2.0->3.5和4.0)库可以用来生成格式正确的CSV文件 此外,如果有任何生成CS

我需要将数据集导出为CSV文件

我花了一段时间搜索一组规则,发现在编写CSV文件时有很多规则和异常

所以现在这不是一个简单的用逗号分隔字符串的过程,我已经搜索了一个现有的CSV编写器,它可以是第三方的,也可以是.net framework中包含的(希望是!)

编辑:新链接:

TextFieldParser是一个VB对象(可以从C#中引用),它将自动解析CSV文件:

我想知道是否有人知道任何方便的.Net(2.0->3.5和4.0)库可以用来生成格式正确的CSV文件

此外,如果有任何生成CSV文件的规则集

有很多关于CSV阅读器和解析CSV文件的详细信息,但是关于编写的信息没有那么多(好的,我知道它正好相反:p)

任何帮助都将不胜感激:)

我发现另一篇文章中有一些更详细的CSV规则:

整洁的第三方库是Linq到CSV(不是框架库):

谢谢大家的帮助。 我已经决定,最好的解决方案是创建一个简单的静态类来进行特殊字符替换(Chris提到)

如果我需要Linq查询我的CSV文件,我会看看Linq到CSV的CodeProjects实现


再次感谢:)

我已经广泛使用了它,它非常适合生成CSV。

如果您的单元格中有逗号,请用双引号将整个单元格括起来,例如:

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc
如果你想要一个双引号,做两个,例如:

cell 1,cell 2,"This is my cell and it has ""quotes"" in it",cell 4,etc

至于日期,坚持ISO格式,您应该会没事的(例如yyyy-mm-dd hh:mm:ss)

您可以使用ODBC读取和写入CSV文件(通过OdbcConnection和合适的连接字符串)。这对于生成CSV文件应该是相当好的,并且可以为您处理诸如报价之类的事情;然而,我在使用它读取其他程序生成的CSV文件时遇到了一些问题。

我发现了这个非常整洁的重要链接。还没试过,会让你知道的

更仔细地看,此实现实际上也只使用基本规则:

特殊字符=\n\”和分隔符字符

如果找到特殊字符,则用引号括起来。 用双引号替换引号

基本上是克里斯提到的规则。
我认为最简单的方法是根据简单规则创建我的helper方法,并根据用户需要进行修改。

要添加到其他规则中的另一个规则是:将逗号用作字段分隔符,而不是字段终止符。原因是行末尾的逗号可能不明确:它没有意义吗或者它是否表示后面有一个空值?

有关规范,请参见我知道您说您找到了答案,但我只是想投票支持您提到的LINQtoCSV库。我在几个项目中使用过它,它非常适合保持您的业务代码干净,而不关心t的细节/特性他选择了文件格式


也许在您的具体情况下,编写导出器并不太困难,但这个库的优点是它是双向的。如果您发现自己不得不使用CSV,那么它没有太多额外的代码,并且/或者它为您提供了一个一致的库,供您在未来的项目中使用。

我只想补充一点指定CSV格式,我将其视为规范源。

(我维护的库)也可通过NuGet获得

CsvHelper可以为您自动将类对象写入文件

var myObj = new MyCustomClass
{
    Prop1 = "one",
    Prop2 = 2
};
var streamWriter = // Create a writer to somewhere...
var csvWriter = new CsvWriter( streamWriter );

// You can write a single record.
csvWriter.WriteRecord( myObj );

// You can also write a collection of records.
var myRecords = new List<MyCustomClass>{ myObj };
csvWriter.WriteRecords( myRecords );
var myObj=新的MyCustomClass
{
Prop1=“一”,
Prop2=2
};
var streamWriter=//在某处创建一个writer。。。
var csvWriter=新的csvWriter(streamWriter);
//你可以写一条记录。
csvWriter.WriterRecord(myObj);
//您还可以编写记录集合。
var myRecords=新列表{myObj};
csvWriter.WriterRecords(我的记录);

是否可以使用字符串数组,然后使用以下方法连接:

string out = "";
string[] elements = { "1", "2" };
foreach(string s in elements) { out += s + "," };
out = out.substring(0, out.Length-1);

以下是可用于从字符串列表生成CSV文件行的函数(也可使用IEnumerable(字符串的)或字符串数组):

函数CreateCSVRow(strArray作为列表(字符串))作为字符串
Dim csvCols作为新列表(字符串)
作为字符串的Dim CSV值
将引号设置为布尔值
对于i As Integer=0到strArray.Count()-1
csvValue=strArray(i)
needQuotes=(csvValue.IndexOf(“,”,StringComparison.InvariantCulture)>=0_
OrElse csvValue.IndexOf(“”,StringComparison.InvariantCulture)>=0_
OrElse csvValue.IndexOf(vbCrLf,StringComparison.InvariantCulture)>=0)
csvValue=csvValue.Replace(“”,“”)
添加(如果(needQuotes,“&csvValue&”,csvValue))
下一个
返回字符串.Join(“,”,csvCols.ToArray())
端函数

正如我所想,从VB.NET转换到C#)并不困难。

我认为,既然你是一个导出者,你在编写时可以相当放松,如果你只遵循一般规则,大多数程序(如Excel)都会知道如何读取它们。这是真的。我不幸地处于编写“导出”的境地“未指定潜在用途的函数。我假设99%的时间这将是excel或其他应用程序可能(不太可能)的SSIS包。不过我只能假设。你可以试试我的非常轻的分隔文件编写器:谢谢,有没有关于这个方法入门的参考资料?如果你搜索“odbc csv文件”,它会弹出一些链接。最上面的一个是——注意,您需要向下滚动到底部才能找到C代码!谢谢,FileHelpers看起来是一个非常方便的(+开源)库。不幸的是,在这种情况下,我无法向我的对象添加属性,我将