0

データスクレイピングを行うために使用される外部ソースからの出力ファイル(CSV)を使用しています。

ただし、「スクラップ」されたWebページは同じ厳密なパターンを持たないため、出力ファイル(Excel)にオフセットされた列があります。幸い、値にはヘッダーの名前が含まれているので、「オフセット」の問題を解決するための解決策を探しています。

PS:一部の行はオフセットされていますが、一部はオフセットされていません。オフセットは1、2、またはそれ以上のセルである可能性があるため、私はできません:value(i + 1)= iロジックがないため、

ここからファイルをダウンロードするか、ここから同じ情報をダウンロードしてください。

FRAME           BRAKES         SADDLE         WHEELS          etc….
brakes: info1   saddle:info1   wheels:info1     
frame:info2     brakes:info2   saddle:info2   wheels: info2 
brakes: info3   saddle:info3   wheels:info3     

いくつかの正規表現と組み合わせたvlookUpでうまくいくかどうかはわかりませんが、

何を指示してるんですか ?

編集:ここからファイルをダウンロード

VBAコード

Option Explicit

Sub test()
Dim Titles As Variant
Dim Data As Variant
Dim Dataline As String
Dim NumDataPoints As Long
Dim FirstTitle As String
Dim WhichTitle As Long
Dim Offset As Long
Dim rowcount As Long

Open "SORTcannodale2013.csv" For Input As #1

Line Input #1, Dataline

Titles = Split(Dataline, ",")
For Offset = 0 To UBound(Titles)
    Cells(1, Offset + 1) = Titles(Offset)
Next

rowcount = 2
'While Not EOF(1)
    Line Input #1, Dataline
    Data = Split(Dataline, Chr$(34) & "," & Chr$(34))

    FirstTitle = LCase(Left(Data(0), InStr(Data(0), vbLf) - 1))
    For WhichTitle = 0 To UBound(Titles)
        If Titles(WhichTitle) = FirstTitle Then Exit For
    Next
    For Offset = WhichTitle To UBound(Titles)
        Cells(rowcount, Offset + 1) = Data(Offset - WhichTitle)
    Next
    rowcount = rowcount + 1
'Wend

Close #1

End Sub
4

2 に答える 2

1

私が思いついた最も簡単な方法は、CSV ファイルを読み込んで、自分でスプレッドシートに書き出すことでした。

タイトルを取得するために最初の行を読みました。

次に、2 行目を読み取り、最初のデータを調べます。次に、これをタイトルと比較してオフセットを取得します。

次に、私が持っているオフセットを使用してデータを書き出します

最後までファイルをループし、終了します。

これにより、常に現在のシートの A1 に書き込みが開始されます。他の場所で書くための演習として残します

Option Explicit

Sub test()
Dim Titles As Variant
Dim Data As Variant
Dim Dataline As String
Dim NumDataPoints As Long
Dim FirstTitle As String
Dim WhichTitle As Long
Dim Offset As Long
Dim rowcount As Long

Open "test.csv" For Input As #1

Line Input #1, Dataline
Titles = Split(Dataline, ",")
For Offset = 0 To UBound(Titles)
    Cells(1, Offset + 1) = Titles(Offset)
Next

rowcount = 2
While Not EOF(1)
    Line Input #1, Dataline
    Data = Split(Dataline, ",")
    FirstTitle = UCase(Left(Data(0), InStr(Data(0), ":") - 1))
    For WhichTitle = 0 To UBound(Titles)
        If Titles(WhichTitle) = FirstTitle Then Exit For
    Next
    For Offset = WhichTitle To UBound(Titles)
        Cells(rowcount, Offset + 1) = Data(Offset - WhichTitle)
    Next
    rowcount = rowcount + 1
Wend

Close #1

End Sub
于 2012-10-25T19:38:39.010 に答える
0

ここで独自の CSV インポート関数を記述する本当の理由はありません。DropBox にアップロードされたファイルには、二重引用符で囲まれたフィールドがあり、フィールド内の二重引用符は正しく二重化されています。

ファイルを Excel に取り込むには、次のように簡単です。

Workbooks.OpenText Filename:="SORTcannodale2013.csv", _
    DataType:=xlDelimited, TextQualifier:=xlTextQualifierDoubleQuote, _
    ConsecutiveDelimiter:=True, Comma:=True

ヘッダー行には、実際には可能なすべての値のエントリが含まれているわけではありません。たとえば、「Rear Shock」と「Extras」はテスト データにありますが、ヘッダー行には表示されません。考えられるすべての値を特定し、それらすべてを含む独自のヘッダー行を作成する必要があります。

各データ エントリ内には、フィールド名、埋め込み改行 (ASCII 文字 10)、およびデータ値があります。エントリをフィールド名と値に分割するにはSplit、以前と同じように関数をChr$(10)区切り文字として使用する必要があります。

データを使用可能なワークシートに変換するには、各フィールド名 (Dictionaryオブジェクトなど) の列番号をハードコーディングし、各エントリからフィールド名を分割し、辞書で適切な列番号を検索し、データ値を出力するだけです。適切なセルに。

このデータを継続的に処理する必要がある場合は、時間をかけてより標準化された形式 (XML など) に変換する価値があります。Excel での処理に特に適したデータはありません。これを XML に変換するには、データ内の一部の文字をエスケープするためにさらに作業を行う必要があります。その後、Excel を使用する必要がある場合は、XML データをインポートするのは簡単です。

于 2012-10-27T02:19:23.037 に答える