LoginSignup
2
2

More than 5 years have passed since last update.

Coding Inverviewに出そうな、QuotingとEscape処理をするSplitCSV()関数作成

Last updated at Posted at 2015-12-16

簡単にcommaでsplitすることで済む場合もありますが、quotingとEscape文字列処理も一緒にやらないといけない場合には少しややこしいですね。
実際に必要だったので作りました。

RegExでMatchのIEnumerableを取る方法も出来そうでしたが、簡単にすべてをTraverseするのが分かりやすいし、Performance的にもよさそうでした。Split()関数にだけ慣れているCoderにはフレッシュな感じであるかも知れませんね。

csharp:SplitCS.cs
    public static IEnumerable<string> SplitCSV(string csvString)
    {
        var sb = new StringBuilder();
        bool quoted = false;
        bool escaped = false;

        foreach (char c in csvString)
        {
            if (quoted)
            {
                if (!escaped && c == '\\')
                {
                    escaped = true;
                    continue;
                }

                if (escaped)
                {
                    sb.Append(c);
                    escaped = false;
                }
                else
                {
                    if (c == '"')
                        quoted = false;

                    sb.Append(c);
                }
            }
            else
            {
                if (c == '"')
                {
                    quoted = true;
                    sb.Append(c);
                }
                else if (c == ',')
                {
                    yield return sb.ToString();
                    sb.Length = 0;
                }
                else
                {
                    sb.Append(c);
                }
            }
        }

        //if (quoted)
        //  throw new ArgumentException("csvString", "Unterminated quotation mark.");

        yield return sb.ToString();
    }
}

Coding Inverviewに出してもよさそうと感じました。

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2