2

フラットファイルを使って何らかの作業を行ったのはこれが初めてです。これはXMLではなくプレーンなtxtファイルである必要があります。

カンマ区切り形式を選択して、次のように記述しました。

    public static void DataTableToFile(string fileLoc, DataTable dt)
    {
        StringBuilder str = new StringBuilder();
        // get the column headers
        foreach (DataColumn c in dt.Columns)
        {
            str.Append(c.ColumnName.ToString() + ",");
        }
        str.Remove(str.Length-1, 1);
        str.AppendLine();
        // write the data here
        foreach (DataRow dr in dt.Rows)
        {
            foreach (var field in dr.ItemArray)
            {
                str.Append(field.ToString() + ",");
            }
            str.Remove(str.Length-1, 1);
            str.AppendLine();
        }
        try
        {
            Write(fileLoc, str.ToString());
        }
        catch (Exception ex)
        {
            //ToDO:Add error logging
        }
    }

私の質問は:これをより良くまたはより速くすることができますか?そして、私が考えることができる唯一の方法であるstr.Remove(str.Length-1, 1);最後のものを取り除くためにそこにあります。,助言がありますか?

4

2 に答える 2

3

使用する

public static void DataTableToFile(string fileLoc, DataTable dt)
{
    StringBuilder str = new StringBuilder();

    // get the column headers
    str.Append(String.Join(",", dt.Columns.Cast<DataColumn>()
                                      .Select(col => col.ColumnName)) + "\r\n");

    // write the data here
    dt.Rows.Cast<DataRow>().ToList()
           .ForEach(row => str.Append(string.Join(",", row.ItemArray) + "\r\n"));

    try
    {
        Write(fileLoc, str.ToString());
    }
    catch (Exception ex)
    {
        //ToDO:Add error logging
    }
}
于 2012-06-05T11:15:55.707 に答える
3

重要なポイントは次のとおりです。メモリ内に-を使用してこれを構築する必要はありません。代わりに、などを介しStringBuilderてファイルに書き込む必要があります。APIはに似ていますが、削除しようとしないでください-代わりに、追加しないでください-つまりStreamWriterFile.CreateTextStringBuilder

bool first = true;
foreach(...blah...) {
    if(first) { first = false; }
    else { writer.Write(','); }
    ... write the data ...
}

別の考慮事項として:CSVは、コンマを追加する場合だけではありません。,引用符で囲まれたテキスト(inを含むデータの場合)と複数行のデータについて考える必要があります。データが非常に単純でない限り。.ToString()また、文化に非常に敏感な単なる形式よりも形式を明確にすることもできます。古典的な例は、10進文字として使用されるヨーロッパの大部分です,。したがって、「CSV」は、すべてを引用する必要をなくすために、多くの場合、異なる区切り文字を使用します。選択肢があれば、個人的には常にCSVではなくTSVを使用します-問題は少なくなります(理論的には、タブを使用してデータを処理する必要があります)。

于 2012-06-05T11:17:37.667 に答える