web-dev-qa-db-ja.com

.netでCSVファイルを作成する

データセットをCSVファイルとしてエクスポートする必要があります。

私はしばらくの間、一連のルールを探して、CSVファイルを作成するときにかなりのルールと例外があることに気付きました。

http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.htmlhttp ://bytes.com/topic/c-sharp/answers/236875-problems-streamwriter-output-csvhttp://social.msdn.Microsoft.com/forums/en-US/csharpgeneral/thread/0073fcbb-adab-40f0-b768-4bba803d3ccd

そのため、文字列をカンマで区切るという単純なプロセスではありません。サードパーティまたは(できれば!)フレームワークに含まれている既存のCSVライターを検索しました。

編集:新しいリンク: http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser

TextFieldParserは、CSVファイルを自動的に解析するVBオブジェクト(C#から参照可能))です。

正しくフォーマットされたCSVファイルを生成するために使用できる便利な.Net(2.0-> 3.5および4.0)ライブラリを知っている人がいるかどうか疑問に思っていました。

また、CSVファイルを生成するためのルールのセットがある場合。

CSVリーダーとCSVファイルの解析には多くの詳細がありますが、書き込みについてはそれほど多くはありません(わかりました、ちょうど反対です:P)。

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

どんな助けも大歓迎です:)

より詳細なCSVルールを含む別の記事を見つけました: http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

きちんとしたサードパーティライブラリは、Linq-to-CSV(フレームワークライブラリではありません): http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

皆様のご協力に感謝します。私は、クリスが言及した特別な文字の置き換えを行う単純な静的クラスを作成することが最善の解決策であると判断しました。

CSVファイルを照会するLinqが必要な場合は、Linq-to-CSVのCodeProjects実装を確認します。

再度、感謝します :)

42
Russell

セルにコンマがある場合は、セル全体を二重引用符で囲みます。例:

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc

リテラルの二重引用符が必要な場合は、次の2つを実行します。例:

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

日付に関しては、ISO形式に固執してください(たとえば、yyyy-mm-dd hh:mm:ss)。

21
Chris

CsvHelper (私が管理するライブラリ)も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 );
48
Josh Close

追加したいのは [〜#〜] rfc [〜#〜] です。これは、標準ソースと見なすCSV形式を指定します。

18

filehelpers を広範囲に使用しましたが、CSVを生成するのに非常に優れています。

6
lomaxx

文字列リストからCSVファイルの行を生成するために使用できる関数は次のとおりです(IEnumerable(Of String)または文字列配列も使用できます)。

Function CreateCSVRow(strArray As List(Of String)) As String
    Dim csvCols As New List(Of String)
    Dim csvValue As String
    Dim needQuotes As Boolean
    For i As Integer = 0 To 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("""", """""")
        csvCols.Add(If(needQuotes, """" & csvValue & """", csvValue))
    Next
    Return String.Join(",", csvCols.ToArray())
End Function

私が思うに、VB.NETからC#に変換することは難しくありません)

4
Evgeny Gorb

あなたが答えを見つけたと言ったのは知っていますが、あなたが言及したLINQtoCSVライブラリに投票したかっただけです。私はいくつかのプロジェクトでそれを使用しましたが、ビジネスコードをきれいに保ち、ファイル形式の詳細/特性​​に関係なく、本当にうまく機能します。

たぶんあなたの特定のケースでは、エクスポーターを書くことはそれほど難しくありませんが、このライブラリーのいいところは、それが双方向であることです。将来的にCSVを使用する必要がある場合は、余分なコードはあまり必要ありません。また、将来のプロジェクトで使用するための一貫したライブラリを提供します。

3
super_seabass

仕様については、 http://en.wikipedia.org/wiki/Comma-separated_values を参照してください

3
TrueWill

他のルールに追加する別のルール:フィールドターミネータとしてではなく、フィールドセパレータとしてコンマを使用します。この理由は、行末の末尾のコンマがあいまいになる可能性があるためです。意味がないのか、それに続くNULL値を意味するのか?

2
dan-gph

ODBCを使用してCSVファイルを読み書きできます(OdbcConnectionおよび適切な接続文字列を使用))これはCSVファイルの生成に適しており、引用などの処理を行います;ただし、他のプログラムによって生成されたCSVファイルを読み取るために使用する際に、いくつかの問題が発生しました。

2
itowlson

私はこの重要なリンクを見つけました。まだ試していない、それがどうなるかをお知らせします!

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

さらに詳しく見ると、この実装では基本的に基本的なルールのみを使用しています。

特殊文字=\n\"および区切り文字。

特殊文字が見つかった場合は、引用符で囲みます。引用符を二重引用符に置き換えます。

基本的に、クリスが言及したルール。これを行う最も簡単な方法は、単純なルールに基づいてヘルパーメソッドを作成し、ユーザーのニーズに基づいて修正することだと思います。

0
Russell

文字列配列を使用してから、次を使用して連結できますか?

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