2011-12-29 5 views
6

私は私のお父さんを助けようとしています - 彼は私の仕事でスケジューリングアプリケーションからエクスポートを与えました。彼/彼女がオンラインでコラボレーションできるように、MySQLデータベースにインポートできるかどうかを確認しようとしています。非常に忙しいスペースで区切られたファイルの解析

私はさまざまな方法を試しましたが、どれも正しく機能していないようです。これは私の専門分野ではありません。

エクスポートはここで見ることができます:http://roikingon.com/export.txt

これを解析することについて移動する方法上の任意のヘルプ/アドバイスをいただければ幸いです!

ありがとうございます!

+0

アドバイス...まあ、そのエクスポートのデータ形式を知っている必要があります。また、アドレスは空白で区切られ、列間にタブはありません。自動的に解析する情報が不足しているようです。 – alxx

+2

私の推測:固定幅で、最初の3文字はレコードタイプです。すべてのレコードタイプは同じフォーマットです(つまり、レコードタイプ4のすべての行に同じ2つの列があり、レコードタイプ17.1には1つの列しかありませんが、新しい「ルートブロック」を開始するようです)。 – vstm

+2

あなたのデータをインラインに含めないためのフォームが悪い今、リンクは死んでいるので、あなたの質問を文脈化することは不可能です。または、pastebinなどを使用してください...ちょうどスティン.. – ftrotter

答えて

2

(やや動的な)固定列のパーサーを作成しようとしました。見てみましょう:http://codepad.org/oAiKD0e7(これは長すぎますので、ほとんどの場合「データ」です)。私が気づいた何

  • テキストデータが
  • 数値データを右から左"___42"
上のパディングと整列される "hello___"_ =スペース)のように、右側にパディングを左揃えにされ

    :あなたは私のコードを使用したい場合は

    はまだやるべきことがあります3210

  • レコード型12.xは可変列数を持っています(いくつかの静的列の後)、別の「ハンドラ」を実装する必要があります
  • 私の幅の中にはおそらく間違っています。私はシステムがあると思う(数字は4文字、テキストは8文字、特殊な場合はいくつかの違いがある)。ドメイン知識と複数のサンプルファイルを持つ人が列を見つけ出すことができます。
  • 生データを取り出すことは最初のステップにすぎません。生データをある有益なモデルにマップし、そのモデルをデータベースに書き込む必要があります。
+0

Ha!私は実際には全く同じことをしています。私はそれをやや異なったthoでした。私は、1行あたりのデータの配列を返す関数を持つ大きな配列ではなく、スイッチを使用しました。 良いもの! – Roi

1

splitを正規表現(ゼロ以上のスペース)で使用することができます。

私はあなたに知らせてくれます。

データが入っている構造がないようです。

$data = "12.1 0 1144713  751 17 Y 8 517 526 537 542 550 556 561 567          17 "; 

$arr = preg_split("/ +/", $data); 
print_r($arr); 

Array 
(
    [0] => 12.1 
    [1] => 0 
    [2] => 1144713 
    [3] => 751 
    [4] => 17 
    [5] => Y 
    [6] => 8 
    [7] => 517 
    [8] => 526 
    [9] => 537 
    [10] => 542 
    [11] => 550 
    [12] => 556 
    [13] => 561 
    [14] => 567 
    [15] => 17 
    [16] => 
) 

ゼロ以上の空白で行を分割し、このpreg_split("/ +/", $data);を試してみては、その後、あなたが処理できる、素敵な配列を持つことになります。しかし、あなたのデータを見ると、構造体は存在しないので、どの配列要素がどのデータに対応しているかを知る必要があります。

幸運。

+0

ちょっと - これは私の最初の考えだった..そして実装するために始めたが、これは "列の区切られた"と考えられていることを意味nullレコードがあり、これを行うことはそれらのレコード。私は、何が起こっているのか、それについて何か説明したPDFを見つけました。それはフィールドの長さを含んでいました。そのフィールドの長さを使用して私はsubstr($行、$列の位置、$フィールド長) – Roi

+0

私は幸運を言ったように使用することができます。このようなデータを解析するのは非常に難しいです。 – DarthVader

1

excelで開き、カンマ区切りで保存します。連続する区切り文字を1つとして扱います。その後、csvとしてExcelで再保存します。これはコンマで区切られ、mysqlにインポートするのが簡単です。

EDIT: "[+]"にpreg_splitを使用すると、上記のように基本的に同じ回答が得られます。

それでは、それ以降は何をすべきかという疑問があります。

「行の種類」はいくつありますか?それを決定して特性を定義すれば、それを通過するコードを書くのがずっと簡単になります。

csvで保存すると、PHPのfgetcsv関数と関連する関数を使用できます。各行について、そのタイプをチェックし、タイプに応じて操作を実行します。

最初の列のデータに「。」が含まれているかどうかで、データ行が分割される可能性があることに気付きました。ここでは、ファイルをループする方法の例を示します。

ながら($行= fgetcsv($ file_handle)){ (strpos($行[0]、 '')===偽){ //行う他{ }何か を行う場合何か他のもの } }

"何かをする" とは、 "TABLE table_$row[0]をCREATE" のようなものであるか、などを "tableのINSERT INTO"

[OK]を、ここでいくつかのより多くの観測だでしょう:

あなたのファイルされますr複数のファイルが一緒に接着されているのが好きです。それは複数のフォーマットを含んでいます。「4」で始まるすべての行は、4文字の会社略語に続いて完全な会社名が続きます。それらの1つは "caco"です。 "caco"を検索すると、ファイル内の複数の "テーブル"で検索されます。

また、「smuwtfa」(曜日)に振りかざすことがあります。

このような手がかりを使用して、各行の処理方法の論理を判断します。

+1

ファイルを詳しく見てみると、これはCSVに変換するという単純な問題ではないことがわかります。そこに含まれるデータはそれよりはるかに複雑です。これは、リバースエンジニアリング、解析、そしていくつかの異なるテーブルへのインポートを必要とします。 –

+0

データ構造が何であるかを知ることさえ困難です。デコードする必要がある構造の要約を実際に投稿した方がより役に立ちます。 –

+0

私はsubstrを使ってこれを行い、セクションごとのフォーマットに従うことができたようでした – Roi

2

このファイル構造では、基本的に独自のフォーマットをリバースエンジニアリングする必要があります。はい、スペース区切りですが、フォーマットはCSV、YAMLなどのような標準に従っていません。ヘッダーと思われるものと独自のヘッダーを持つ別個のセクションで完全に所有しています。

私はあなたの最善の策は、ExcelやXMLなどのような他のタイプのエクスポートがあるかどうかを試してみることです。もしスクリーンが傷つき、Excelに貼り付けることができ、あなたが得るものを見て何かのhtml出力があるかどうか見ていない場合。

私が上で述べたすべてのもののために、現在の形式のファイルを目立つようにデータベースにインポートすることは非常に難しいでしょう。ファイル構造から多くのテーブルが必要になることに注意してください。

関連する問題