0

私は CSVHelper を使用して、MySqlDataReader を使用して取得した List<> を記述しています。私の問題は、CSV ファイルを正しくフォーマットすることです。列名でデータを配置する場所を指示するマッパー クラスを作成しました。

    public ReaderMap()
    {
        Map(m => m.accountpersonfirstname).Name("E-mail Address");
        Map(m => m.accountpersonlastname).Name("First Name");
        Map(m => m.emailaddress).Name("Last Name");
    }

これはhttp://joshclose.github.io/CsvHelper/#mapping-nameから直接取得されます。

私の問題は、ストリームライターが毎回新しい CSV ファイルを作成するために既存の csv に書き込む方法にあると想定します (そして、名前を失います)。ただし、インデックスによるマッピングを次のように使用しようとしました。これは新しいCSVファイルで機能するはずですが、データが読み取れるように列を数列離して表示したい場合でも、データが隣り合って配置されます-ヘッダー名も必要です。

これが私の 2 つのクラスです。マッパーと元のデータ クラスです。

class Reader
{
    public string emailaddress { get; set; }
    public string accountpersonfirstname { get; set; }
    public string accountpersonlastname { get; set; }
}

class ReaderMap : CsvClassMap<Reader>
{
    public ReaderMap()
    {
        Map(m => m.accountpersonfirstname).Name("E-mail Address");
        Map(m => m.accountpersonlastname).Name("First Name");
        Map(m => m.emailaddress).Name("Last Name");
    }
}

また、コードの一部を貼り付けます。これは、前述のように、ストリーム ライターを正しく使用していない可能性があるためです (使用していると思いますが)。

            MySqlCommand cmd = new MySqlCommand(sqlCmd, cn);
            cmd.CommandType = CommandType.Text;
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Reader dataExport = new Reader();

                dataExport.accountpersonfirstname = rdr.GetString(0);
                dataExport.accountpersonlastname = rdr.GetString(1);
                dataExport.emailaddress = rdr.GetString(2);


                dataList.Add(dataExport);

            }

            var textWriter = new StreamWriter(filePath);

            var csv = new CsvWriter(textWriter);
            csv.Configuration.RegisterClassMap<ReaderMap>();
            foreach (var item in dataList)
            {
                csv.WriteRecord(item);
            }

おそらく、問題は上記のストリームライターの開始にあるのか、それともデータ リーダーの使用に問題があるのか​​ 、完全にはわかりません。誰かが私のためにこれに光を当ててくれることを願っています。

編集:

以下を使用すると、正しく追加できたようです。ただし、私の元の問題は、csvファイルのヘッダーの姓と名をさらに列FとGに移動すると、設定したクラスと構成を完全に無視しているかのように、それらをBとCに配置するという事実にまだ存在します.

var textWriter = new StreamWriter(filePath, true);
4

1 に答える 1

1

カスタムを使用するとCsvClassMap、プロパティが無視されない限り、出力は列ごとのプロパティでギャップなしで書き込まれます。この場合、プロパティは出力されませんが、無視された場所にギャップは作成されません。

必要なギャップを作成するには、必要な形式でファイルを書き出すカスタム メソッドを作成する必要があります。

//Write out the header
var csv = new CsvWriter(textWriter);
csv.WriteField("A Column Data");
csv.WriteField("B (Empty)");
csv.WriteField("C (Empty)");
csv.WriteField("D (Empty)");
csv.WriteField("E (Empty)");
csv.WriteField("F Column Data");
csv.WriteField("G Column Data");
csv.NextRecord(); //Newline

foreach (var item in dataList)
{
    csv.WriteRecord(item.PropertyA);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(string.Empty);
    csv.WriteRecord(item.PropertyB);
    csv.WriteRecord(item.PropertyC);
    csv.NextRecord();
}

そうは言っても、なぜギャップを挿入しようとしているのですか?ギャップを挿入しても csv が読みやすくなることはありません。Excel やその他のスプレッドシート アプリで開いている場合は、ヘッダーの右側の境界線をダブルクリックすると、列幅が自動的に拡張されます。

于 2016-02-12T20:43:41.980 に答える