2010-12-16 28 views
3

3, asdf, *#, 1212.3のようなカンマ区切りのリストが与えられている場合は、カンマを除いてこれらの値をそれぞれ抽出したいので、[3, "asdf", "*#", 1212.3]のような値リストを使用します(テキスト表現ではありません)。そのような、しかしヒットの配列として)。どうすればいい?私はあなたがDプログラミング言語を使用している参照コンマ区切りリストから値を抽出する

@anArray = split(',', "A,B,C,D,E,F,G"); 
+1

どのようなプログラミング言語ですか? – Asaph

+1

Dプログラミング言語。 –

答えて

2

まず、CSVファイルを扱っている場合は、regexや独自のパーサーを使用しないでください。基本的に、物事はシンプルだと思うと、実際にはそうではありません。Stop Rolling Your Own CSV Parser

次に、配列([3、 "asdf"、 "*#"、1212.3])が必要です。これは、タイプが混在しているように見え、静的言語では実行できません。そして、最終的にstd.variantを使用しても非常に非効率的です。あなたのデータは本当に文字のいくつかの定義された集合によって分離され、そして新しい行のレコードに分割されていない場合さて、あなたは「(スプリットを使用することができます

try { 
    auto data = to!double(parsedValue); 
    auto data2 = to!int(data); 
    if(data == data2) 
     returnThis = Variant(data2); 
    else 
     returnThis = Variant(data); 
} catch(ConvException ce) { } 

:各解析された値について次のようなコードがあると思います、 ")からstd.algorithm。それ以外の場合は、CSVパーサーを使用します。標準に準拠したくない場合は、パーサーをラップして、データがあなたの望むものになるようにします。あなたの例では、CSV形式で無視されないスペースがあるので、出力でstrip()を呼び出します。

the article I linkedでは、一般的に起こることは、パーサーを最も単純な形で記述し、より複雑なケースを処理しないということです。あなたがCSVパーサを探すときには、それをカットしないものがたくさんあります。これはあなた自身のパーサを書くことです、私が言うことは、ちょうどすべての有効なCSVファイルを処理することです。

幸運にも、あなたは自分で書く必要はありません。私は慎重にCSV Parser for Dを作っています。エラーチェックは現在行われていませんが、私はパッシングを修正して続行できるように問題を報告する最良の方法を知らない。使用例はunittestブロックにあります。構造体を解析することもできます:

struct MyData { 
    int a; 
    string b; 
    string c; 
    double d 
} 

foreach(data; csv.csv!MyData(str)) // I think I'll need to change the module/function name 
    //... 
1

perlであなたのような何かを行うことができます。 CSV parser for Dへのリンクがあります。

+0

一部のCSVフィールドにカンマがある場合はどうなりますか?例えば。 「私の、第一のフィールド」、「私の、第二のフィールド」、「私の、第三のフィールド」はCSVで完全に合法です。 – Asaph

+0

とにかくOPはDプログラミング言語を使用しています。したがって、perlの答えは関係ありません。 – Asaph

+0

@Asaph私の提案には申し訳ありませんが、D言語に関する説明が行われたのと同じように投稿をしたようです。いずれにせよ、カンマがフィールド内に存在する場合、すべてのフィールドが引用符で囲まれていない限り、CSVパーサに問題があると思われます。この場合、解析する際に引用符を数えなければなりません。 – Bnjmn

5

+0

コメントの方法であまりそれを持っていないため申し訳ありません。しかし、unittestセクションは、それがどのように使われているかについての良い例を与えるべきです。また、これはおそらくより良いURLです:https://github.com/he-the-great/JPDLibs/tree/csv –

+0

@he_the_great:あなたが提案した新しいものへのリンクを更新しました。ありがとうございました。 – Asaph

0

(?:,|\s+)?([^ ,]+)とする必要があります。 カンマまたはスペースをスキップし、カンマまたはスペース以外のものを選択します。好みに合わせて修正する。

+0

これはシンプルなCSV形式であっても単純すぎます。詳細については、@ Bnjmn'sのコメントを参照してください。 – Asaph