6

特定のログ操作用に書き出すCSV形式のログがあります。ただし、フィールドの1つでユーザー入力が許可されているため、フィールドにカンマを入力した場合は、解析して、Excelがカンマを読み取って表示できるようなものに置き換える必要があります。場所(したがって、csvリーダーはそれが列の終わりであるとは見なしません)。

現在、コンマをに置き換えていますが,、これはExcelではリテラル文字列として表示されます。

実際のカンマ文字を使用せずにCSVファイルにカンマを表示する標準的な方法はありますか?ほとんどのお客様はExcelを使用してこのファイルを表示するため、Excelでのみ機能するソリューションでも機能します。

4

4 に答える 4

20

埋め込まれたコンマを処理する最良の方法は、CSVファイルを適切に引用することです。

  • カンマを含む列は引用符で囲む必要があります
  • 引用符を含む引用符付きの列では、引用符をエスケープする必要があります

例:

ジョー・スミス、「ジョー・スミス・ジュニア」、「ジョー」「ザ・マン」「スミス・ジュニア」

私はこれを解決するのに役立つ拡張メソッドを書きました:

static public string CsvQuote(this string text)
{
    if (text == null) return string.Empty;

    bool containsQuote = false;
    bool containsComma = false;
    int len = text.Length;

    for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++)
    {
        char ch = text[i];
        if (ch == '"')
        {
            containsQuote = true;
        }
        else if (ch == ',' || char.IsControl(ch))
        {
            containsComma = true;
        }
    }

    bool mustQuote = containsComma || containsQuote;

    if (containsQuote)
    {
        text = text.Replace("\"", "\"\"");
    }

    // Quote the cell and replace embedded quotes with double-quote or just return as is
    return mustQuote ? "\"" + text + "\"" : text;
}

利用方法:

logger.Write(myString.CsvQuote());

var csv = string.Join(",", listOfStrings.Select(CsvQuote))
于 2013-02-08T18:59:27.933 に答える
1

文字列を引用符で囲むと、コンマを使用できます。

"please sir,", can I, have some more?

于 2013-02-08T19:02:59.610 に答える
0

CSVもコンマだけでなく「文字区切り値」です。

任意の文字を区切り記号として使用できますが、通常はユーザー入力では使用されないため、tabor\tが広く使用されています。

CSV の RFC はRFC 4180です。

データ フィールドとフィールド セパレータを使用することをお勧めします。ここに原文があります。(5) の Microsoft Excel の特殊な部分に注意してください。

5.  Each field may or may not be enclosed in double quotes (however
   some programs, such as Microsoft Excel, do not use double quotes
   at all).  If fields are not enclosed with double quotes, then
   double quotes may not appear inside the fields.  For example:

   "aaa","bbb","ccc" CRLF
   zzz,yyy,xxx

6.  Fields containing line breaks (CRLF), double quotes, and commas
   should be enclosed in double-quotes.  For example:

   "aaa","b CRLF
   bb","ccc" CRLF
   zzz,yyy,xxx

7.  If double-quotes are used to enclose fields, then a double-quote
   appearing inside a field must be escaped by preceding it with
   another double quote.  For example:

   "aaa","b""bb","ccc"

また、Excel は既定でタブを認識することに注意してください。

于 2013-02-08T18:59:49.753 に答える
0

フィールド全体を引用符で囲むことができます。ほとんどの CSV パーサーは、コンマがデータの一部であり、フィールドの終わりではないことを理解します。

または、別のセパレータを使用してください。これには、ファイルを直接開くだけでなく、Excel のテキスト インポート ウィザードを使用する必要があります。私は通常、~またはを使用します|

于 2013-02-08T19:01:09.723 に答える