1

私のコードは、2 つの文を含む特定のフィールドを処理していません。最初の文を .csv ファイルの正しいセルに書き込みます。ただし、SQL フィールドの 2 番目の文は、2 行下の最初の列に書き込まれます...

private void SQLToCSV(string query, string Filename)
        {

            SqlConnection conn = new SqlConnection("redacted");
            conn.Open();
            SqlCommand cmd = new SqlCommand(query, conn);
            SqlDataReader dr = cmd.ExecuteReader();

            using (System.IO.StreamWriter fs = new System.IO.StreamWriter(Filename))
            {
                // Loop through the fields and add headers
                for (int i = 0; i < dr.FieldCount; i++)
                {
                    string name = dr.GetName(i);
                    if (name.Contains(","))
                        name = "\"" + name + "\"";

                    fs.Write(name + ",");
                }
                fs.WriteLine();

                // Loop through the rows and output the data
                while (dr.Read())
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        string value = dr[i].ToString();
                        if (value.Contains(","))
                            value = "\"" + value + "\"";

                        fs.Write(value + ",");
                    }
                    fs.WriteLine();
                }
            }
4

2 に答える 2

1

あなたが私に尋ねるなら、CSVは厄介なフォーマットです。コンマは伝統的に列を終了し (コンマが小数点文字である文化ではセミコロンを使用することがあります)、改行は行を終了します。コンマまたは改行データがデータとして扱われるようにするには、それらを二重引用符のペアで囲みます。

ただし、リストに別の特殊文字が追加されます。データに二重引用符の値が含まれている場合はどうなるでしょうか。それらを二重二重引用符に変換する必要があります。

1,10,"This is my
multiline csv value, it ""may"" cause your parser to fail",8

ウィキペディアは、一部のプログラムが規則に従わないと述べています。

改行が埋め込まれたフィールドは引用符で囲む必要があります (ただし、多くの CSV 実装ではこれがサポートされていません)。

メモ帳などでデータを調べて、問題がコードを使用するプログラムではなくコードにあることを確認することをお勧めします。

于 2013-09-27T13:55:02.980 に答える
0

おそらく、あなたの文章には、csv を壊しているキャリッジ リターンとライン フィードが含まれています。
入力フィールドの読み取り中に、その NewLine 文字を削除できます。
また、文字列ビルダーを使用して、ループの最後にすべてを書き込むことをお勧めします

// Loop through the rows and output the data
StringBuilder sb = new StringBuilder();
while (dr.Read())
{
    for (int i = 0; i < dr.FieldCount; i++)
    {
        string value = dr[i].ToString();
        if (value.Contains(","))
            value = "\"" + value + "\"";

        sb.Append(value.Replace(Environment.NewLine, " ") + ",");
    }
    sb.Length--; // Remove the last comma
    sb.AppendLine();
}
fs.Write(sb.ToString());
于 2013-09-27T13:46:55.940 に答える