1

さて、csvビルダーは基本的に機能しています。3 つの列があります。名前、役職、日付。残念ながら、現在、エクスポートには 4 つの列があります。姓、名、役職、日付。これは、名前のデータベースから取得したデータが最後から最初になるためです。この区切り文字を簡単に変更できる方法はありますか? これはとても便利でしょう。

4

3 に答える 3

1

私はこれを何度かしなければなりませんでしたが、あなたの最善の策はあなたの名前を包むことです. これは、それを個別に処理する必要があることを意味します (一種)。

あなたの質問で読んだ内容に基づいて、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 の間のコンマをエスケープします。

于 2010-08-23T16:31:29.670 に答える
0

問題は区切り文字を変更することではありません (コード内のビットをカンマで変更して、使用したい文字に変更するだけです) が、後で相互運用性が失われることです。

あなたの問題は、フィールドを正しくエスケープしていないことです。次のようにします。

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のビットは、「最後、最初」形式を処理します。

于 2010-08-23T16:28:26.137 に答える
0

ほとんどの CSV パーサーは、引用符を認識して、データ内のコンマを補正します。

"Last, First",Admin,2010/01/01
于 2010-08-23T16:15:32.523 に答える