私は次のタスクの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行ずつ読み込み、最初の値を検出して覚えておき、現在の行を結果文字列に追加してループする新しい最初の値が出現するまで?
ありがとうございました!別々のファイルにファイルを分割するのはなぜ ハイコ
これを分割しないのですか?私がやることは、最初の列も持っているテンポラリテーブルを作成し、すべてをインポートすることです。次に、phpを使用して列1の別のリストを照会し、ループオーバーして、 'INSERT INTO {$ tableName} SELECT col2、col3 ...などのクエリを実行します。テーブルごとに可変数のカラムがある場合は、各テーブルをPHPで記述してカラムを取得し、必要なものだけを選択してください。また、テンポラリテーブルに必要なカラムの最大数を設定します。 –
あなたの素早い答えに感謝ジョナサン。ロードデータのinfileを使用してmysqlにデータをインポートするのは簡単で高速なので、私は分割を好むので、入力ファイルを分割する良い方法を探しています。さらに、データタイプはブロックごとに異なります(たとえば、ブロック1の2番目のフィールドはint、ブロック2の時間は...)。 – Heiko
@Jonathan Kuhn、私はついにあなたの提案に従う時間がありました。私はそれがより複雑になると思ったが、すべてが滑らかで速く走っていたので、私に正しい方向を教えてくれてありがとう! – Heiko