3

httpダウンロードで取得したcsv文字列(utf-8)があります。

状況に応じて、文字列内のデータには異なる数の列が含まれる可能性がありますが、文字列が処理されるたびに、同じ数の列が含まれ、連続します。(データは均一になります)。

文字列には任意の数の行を含めることができます。

最初の行は常に見出しになります。

文字列フィールドは二重引用符で囲まれ、コンマ、引用符、改行を含めることができます

文字列内の引用符と二重引用符は、「」と「」を2倍にすることでエスケープされます。

言い換えれば、これは整形式のcsv形式です。標準のファイルオープンメカニズムによるExcelは、このデータのフォーマットに問題はありません。

ただし、場合によっては出力を処理したり、ワークシート上の既存のデータとマージしたりする必要があるため、ファイルに保存してからcsvを開くことは避けたいと思います。

編集により次の情報を追加しましたExcelアプリケーションはさまざまな宛先に配布され、潜在的なアクセス許可の問題が発生する可能性がある場合は避けたいと思います。ディスクに何も書き込まないのが良い方法のようです。

私は次のような疑似を考えています:

rows = split(csvString, vbCrLf)  'wont work due to newlines inside string fields?

FOREACH rows as row
    fields = split(row, ',')     'wont work due to commas in string fields?
ENDFOR

明らかに、それは特別なトークンを含むフィールドを処理できません。

このデータを解析する確実な方法は何ですか?

ありがとう

2012年10月13日データサンプルの編集

メモ帳に表示されるcsv(すべての改行が\ r \nになるわけではないことに注意してください\n一部は\nになる可能性があります)

LanguageID,AssetID,String,TypeID,Gender
3,50820,"A string of natural language",3,0
3,50819,"Complex text, with comma, "", '' and new line
all being valid",3,0
3,50818,"Some more language",3,0

Excel 2010の同じcsv-シェルから開きます(ダブルクリック-追加オプションなし) ここに画像の説明を入力してください

4

2 に答える 2

5

ブックにデータを入れてもかまわない場合:空白のワークシートを使用し、データを1列に追加してから、TextToColumnsを呼び出すことができます。次に、データを配列として戻したい場合は、ワークシートのUsedRangeからデータをロードするだけです。

'Dim myArray 'Uncomment line if storing data to array.
'Assumes cvsString is already defined
'Used Temp as sheet for processing
With Sheets("Temp")
    .Cells.Delete
    .Cells(1, 1) = cvsString
    .Cells(1, 1).TextToColumns Destination:=Cells(1, 1), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False
    'myArray = .UsedRange 'Uncomment line if storing data to array
End With
于 2012-10-13T00:24:46.090 に答える
1

私は3つの可能性を考えることができます:

  1. 正規表現を使用してテキストを処理します。このような文字列を分離するために、SOおよびgoogleを介して利用できる例がたくさんあります。
  2. Excelの機能を使用します。テキストを一時ファイルに保存し、一時シートを開いて、シートからデータを読み取ります。完了したら、ファイルとシートを削除します。
  3. ADOを使用してデータをクエリします。文字列を一時ファイルに保存し、そのファイルに対してクエリを実行して、必要なフィールドを返します。

より具体的なアドバイスを提供するには、入力データと期待される出力のサンプルが必要になります

于 2012-10-13T02:41:24.520 に答える