LoginSignup
0
1

More than 5 years have passed since last update.

csharp > csv > 1項目にカンマを含むN項目文字列のパース > Regex()を使う実装

Last updated at Posted at 2016-08-24

関連 http://qiita.com/7of9/items/076cf5aaff7095bb876d
関連 http://qiita.com/7of9/items/fa852a99ccfabc112690

在庫表示システム。

qiita.png

About:の項目にカンマを含む文字列を使いたい。

v0.1 > 失敗

C#でコードを書いてみた。

@ C# Online Snippet Compiler

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
  public static void Main()
  {
        string line = "\"AAA,AAA\",BBB,CCC,DDD";

    Console.WriteLine(line);

    string [] elements = line.Split(',');
    foreach(string elmnt in elements) {
      Console.WriteLine(elmnt);
    }
  }
}

lineはEXCELで1セル内にAAA,AAAと入れたもの(下記)をcsv出力した時の文字列。

qiita.png

結果
"AAA,AAA",BBB,CCC,DDD
"AAA
AAA"
BBB
CCC
DDD

やはりパースで失敗して、AAA,AAAが2つの項目となる。

v0.2 > 成功

stackoverflow
にそれらしいコードがあった。

v0.2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions; // for Regex

public class Program
{

  public static string[] SplitCSV(string input)
  {
    Regex csvSplit = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled);
    List<string> list = new List<string>();
    string curr = null;
    foreach (Match match in csvSplit.Matches(input))
    {        
      curr = match.Value;
      if (0 == curr.Length)
      {
        list.Add("");
      }

      list.Add(curr.TrimStart(','));
    }

    return list.ToArray<string>();
  }

  public static void Main()
  {
        string line = "\"AAA,AAA\",BBB,CCC,DDD";

    Console.WriteLine(line);

    string [] elements = SplitCSV(line);

    foreach(string elmnt in elements) {
      Console.WriteLine(elmnt);
    }
  }
}
結果
"AAA,AAA",BBB,CCC,DDD
"AAA,AAA"
BBB
CCC
DDD

成功。

あとは前後のダブルクォーテーションを消せば良さそう。

0
1
0

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
0
1