さて、csvビルダーは基本的に機能しています。3 つの列があります。名前、役職、日付。残念ながら、現在、エクスポートには 4 つの列があります。姓、名、役職、日付。これは、名前のデータベースから取得したデータが最後から最初になるためです。この区切り文字を簡単に変更できる方法はありますか? これはとても便利でしょう。
3 に答える
私はこれを何度かしなければなりませんでしたが、あなたの最善の策はあなたの名前を包むことです. これは、それを個別に処理する必要があることを意味します (一種)。
あなたの質問で読んだ内容に基づいて、Name
(LName、FName)、Position
およびの 3 つの列を持つ DB から値を取得していますDate
。したがって、SQL ステートメントは次のようになりSELECT Name, Position, [Date] FROM Table WHERE ...
ます。おそらくどこかにデータ リーダーがあります。
これらの仮定に基づいて、私はこれを行います:
//SQL Connection and SQL Command have been created separately as _conn and _cmd
using(SqlDataReader _read = _cmd.ExecuteReader())
{
string name = "";
string position = "";
string date = "";
while(_read.Read()) //don't really do this, make sure you're checking for nulls and such
{
name = _read.GetString(0);
position = _read.GetString(1);
date = _read.GetString(2);
AddLineToLines(string.Format("{0}|{1}|{2}", name, position, date));
//AddLineToLines is a call to add to your list of lines so you can
// write your file.
}
}
これにより、(CSV の代わりに) パイプ区切りファイルを作成し、コンマをエスケープする必要がなくなります。
csv が必要な場合は、最後string.Format
を
string.Format("\"{0}\",{1},{2}", name, position, date)
LastName と FirstName の間のコンマをエスケープします。
問題は区切り文字を変更することではありません (コード内のビットをカンマで変更して、使用したい文字に変更するだけです) が、後で相互運用性が失われることです。
あなたの問題は、フィールドを正しくエスケープしていないことです。次のようにします。
private void WriteItem<T>(StreamWriter sr, T item)
{
string itemString = item.ToString();
if(itemString.IndexOfAny('"', ',', '\n', '\r') != -1)//skip test and always escape for different speed/filesize optimisation
{
sr.Write('"');
sr.Write(itemString.Replace("\"", "\"\""));
sr.Write('"');
}
else
sr.Write(itemString);
}
private void WriteLine<T>(StreamWriter sr, IEnumerable<T> line)
{
bool first = true;
foreach(T item in line)
{
if(!first)
sr.Write(',');
first = false;
WriteItem(sr, item);
}
}
private void WriteCSV<T>(StreamWriter sr, IEnumerable<IEnumerable<T>> allLines)
{
bool first = true;
foreach(IEnumerable<T> line in allLines)
{
if(!first)
sr.Write('\n');
first = false;
WriteLine(sr, line);
}
}
また、「、または改行が存在する場合にアイテムを引用するWriteItemのビットは、「最後、最初」形式を処理します。
ほとんどの CSV パーサーは、引用符を認識して、データ内のコンマを補正します。
"Last, First",Admin,2010/01/01