2016-11-02 10 views
1

私は次のタスクのPHP知識を再活性化しようとしています: 大文字のテキストファイルには、カンマ区切りの情報が含まれています。 各行は単一のデータセットとして理解できます。行の最初の値は、行がどのテーブルに属するかを教えてくれます。テキストファイルを読み込み、ソートしてブロックに分割する

私はファイルを読み込み、行をソートする必要がありますテーブルが一緒になっている)、異なるブロックを検出して別々のテキストファイルに保存した後、infileからのロードデータを使用してmysqlデータベースに高速にインポートできます。

ファイルを開き、次の行をソートすることができます:

<?php 
$lines = file("importfile_unsorted.txt"); 
natsort($lines); 
file_put_contents("importfile_sorted.txt", implode($lines)); 
?> 

これは機能します。しかし、今私は固執する。 importfile_sorted.txtは次のようになります。

"AV1","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0" 
"AV2","0","0","0","0","0","0","0","0","0","0","0:0","0:0","0:0" 

... [これは最初のブロックとなり、すべてのこれらの行は「av.txt」に保存する必要があり、新たなブロック「F」が始まる次の行で

"F1","D","D","Deutsch",,,"0","W" 
"F4","E","E","Englisch",,,"0","W" 
"F7","K","K","Kath.Religionslehre",,,"0","W" 
"F8","Ev","Ev","Evang.Religionslehre",,,"0","W" 
"F9","Eth","Eth","Ethik",,,"0","W" 

... [ファイルf.txtにFXXで始まるすべてのこれらの行を保存し、次のブロックに移動]

"G1","PhL","PÜG" 
"G2","ChL","ChÜ" 

..

:複数の行と
"K1","5a","5a",,"304","Ma","Wei","0","16","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K2","5b","5b",,"303","Wo","Hm","0","32","16","5",,,,,"1","1","0",,"0","0","0","0" 
"K3","5c","5c",,"302","Gr","Ro","0","32","16","5",,,,,"1","1","0",,"0","0","0","0" 

...など。いくつかの他のブロック(L1 ... L97、M、続い

"PL","Di 1","Ba","Q12","Inf1","CoR1" 
"PL","Di 1","Bb","Q12","F","Ü2" 
"PL","Di 1","Eg","Q12","L","M23" 

...と

"PLS","Di 1","Am"," frei " 
"PLS","Di 1","Bad"," ----" 
"PLS","Di 1","Bk"," frei " 

... :以降、このような固定された最初の列を有するブロックが存在しますR1 ... R40、U1 ... U560)。

私はブロックのすべての可能な "識別子"(AVx、Fx、Gx、.. PL、PLS ..)を知っていますが、ブロックが省略され、入力ファイルがそれはまったくありません。 入力ファイルにはすべて約4000行が含まれているので、パフォーマンスは低すぎるはずはありません(タイムクリティカルではありませんが、インポートは年に10回行われます)。

これを "スマート"かつ高速に実行する方法がありますか、入力ファイルを1行ずつ読み込み、最初の値を検出して覚えておき、現在の行を結果文字列に追加してループする新しい最初の値が出現するまで?

ありがとうございました!別々のファイルにファイルを分割するのはなぜ ハイコ

+0

これを分割しないのですか?私がやることは、最初の列も持っているテンポラリテーブルを作成し、すべてをインポートすることです。次に、phpを使用して列1の別のリストを照会し、ループオーバーして、 'INSERT INTO {$ tableName} SELECT col2、col3 ...などのクエリを実行します。テーブルごとに可変数のカラムがある場合は、各テーブルをPHPで記述してカラムを取得し、必要なものだけを選択してください。また、テンポラリテーブルに必要なカラムの最大数を設定します。 –

+0

あなたの素早い答えに感謝ジョナサン。ロードデータのinfileを使用してmysqlにデータをインポートするのは簡単で高速なので、私は分割を好むので、入力ファイルを分割する良い方法を探しています。さらに、データタイプはブロックごとに異なります(たとえば、ブロック1の2番目のフィールドはint、ブロック2の時間は...)。 – Heiko

+0

@Jonathan Kuhn、私はついにあなたの提案に従う時間がありました。私はそれがより複雑になると思ったが、すべてが滑らかで速く走っていたので、私に正しい方向を教えてくれてありがとう! – Heiko

答えて

0

CSVパーサで構築を使用して、手動で http://php.net/manual/en/function.str-getcsv.php

+0

Hm。これで、入力ファイル全体を1つの大きな配列にまとめることができますが、別のブロックを識別して別のテキストファイルに保存する必要があります。 – Heiko

+0

正しいです、これはデータを解析してから、それを使ってやることをやり始めます。 – TravisO

関連する問題