私は 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);