2011-07-10 22 views
0

コンマを含む二重引用符で囲まれた文字列を分割することなく、コンマ区切り文字列を分割する文字列分割関数が必要です。これを行う関数はありますか?正規表現で処理するのが最善の場合は、必要なパターンを指定し、該当する場合は、私が知るべき速度最適化のヒントを教えてください。たとえば、正規表現パターンを毎回再評価する必要がないような方法で正規表現を呼び出す方法がある場合などです。この関数は、短期間に何千回も呼び出されます。引用符で囲まれた文字列に影響を与えずに文字列を分割する、本当に高速のJava関数ですか?

注、私はこの1つのようにSO上で正規表現の記事を参照してくださいました。

Regular Expression To Split On Comma Except If Quoted

しかし、彼らは、Java、C#や他の言語であり、ではありません。また、より高速な非正規表現メソッドがある場合は、上記のようにそれについて知りたいと思います。

- roschler

+0

あなたは受け入れられた回答なしで30以上の質問があります。たぶんあなたは答えられるより多くの質問をするべきです。;) –

答えて

6

あなたはCSV形式の文字列/ファイルを解析しようとしているようですね?

もしそうなら、あなた自身でコードを書く必要はないかもしれません。チェックアウトCSV解析用のApache Commonsのライブラリ:

http://commons.apache.org/sandbox/csv/

+3

+1 Btw、私はあなたの答えを読むときにMicrosoft Paperclipを考えるのを助けることができませんでした:) –

+1

母、それは意図ではありませんでしたが、私はあなたの点を見ています:) –

+0

リンクMoeのおかげで、一見。 –

1

は、私がこれを行うJavaのための最も人気のあるライブラリが自然にsupercsvopencsvだと思います。ライブラリ以外のソリューションをお探しですか?

2

あなたは基本的にリンクされ、質問からC#コードをオフにリッピングすることができますが、あなたはそれを言う、とyield returnを置き換え、イテレータのものです元に戻す必要がある、リストに追加:StrTokenizerは同様コモンズ・ラングライブラリでもあります、これは、もちろん、引用符で囲まれた文字列でエスケープ引用符に対処しないこと

public static List<String> SplitCSV(String csvString) 
    StringBuilder sb = new StringBuilder(); 
    boolean quoted = false; 

    List<String> list = new ArrayList<String>(); 

    for(char c : csvString.toCharArray()) { 
     if (quoted) { 
      if (c == '"') 
       quoted = false; 
      else 
       sb.append(c); 
     } else { 
      if (c == '"') { 
       quoted = true; 
      } else if (c == ',') { 
       list.add(sb.toString()); 
       sb = new StringBuilder(); 
      } else { 
       sb.append(c); 
      } 
     } 
    } 

    if (quoted) 
     throw new IllegalArgumentException("csvString: Unterminated quotation mark."); 

    list.add(sb.toString()); 
    return list; 
} 

は注意...

0

StrTokenizer tokenizer = StrTokenizer.getCSVInstance(); 
tokenizer.reset(input); 
String tokens[] = tokenizer.getTokenArray(); 

もリストとしてトークンを取得する方法がありますし、ループしながら、あなたはイテレータのスタイルでそれを使用することができますので、それはイテレータ/反復子機能を実装しています。

"リセット"メソッドを呼び出してインスタンスをクリアし、新しい入力データを解析することもできます。

注意すべき点の1つは、Readerインスタンスを持つOpenCSV単語であり、複数の行にわたって解析されます。このクラスは、文字列または文字配列で動作し、単一のレコードのみを解析します。最初のトークンを要求すると、すべての解析が先行して行われるため、メモリオーバーヘッドが発生します。

ただし、OpenCSVよりも多くの設定が可能です。

公開:このクラスのオリジナル版をライブラリに寄贈しました。

関連する問題