2016-11-02 97 views
1

我正在嘗試重新激活我的php知識以執行以下任務: 我有一個較大的文本文件,其中包含未分類的逗號分隔信息行,每個值都以'''括起來。 每行可以理解爲單個數據集,行的第一個值告訴我該行屬於哪個表。將文本文件讀取,排序並將其拆分爲塊

現在我需要讀取文件,對行進行排序(以便屬於同一行的行表一起),檢測不同的塊,並將它們保存在單獨的文本文件中。之後,我可以使用來自infile的加載數據快速導入到mysql數據庫..

所以,我可以通過以下方式打開文件並對行進行排序:

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

This works。但現在我陷入困境。 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" 

... [保存爲fxx開頭的幾行代碼寫進文件f.txt並進入下一個塊]

"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" 

...等等。以後,有塊與這樣固定的第一列:

"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 " 

... 其次是其他幾個塊(L1 ... L97,M R1 ... R40,U1 ... U560)。

我知道塊的所有可能的「標識符」(AVx,Fx,Gx,.. PL,PLS ..),但是也可以省略塊並且輸入文件不是單行它根本就沒有。 輸入文件一共包含大約4000行,所以性能不應該太低(儘管它不是時間關鍵,每年可能導入10次)。

那麼,有沒有辦法以「智能」和快速的方式完成這項工作,或者我應該逐行讀取輸入文件,檢測並記住第一個值,將當前行添加到結果字符串並循環直到出現新的第一個值?

感謝您的幫助! 海科

+0

爲什麼分割文件到單獨的文件?我會做的是創建一個臨時表,並將第一列導入到該表中。然後使用php來查詢第1列的不同列表,循環並僅運行查詢'INSERT INTO {$ tableName} SELECT col2,col3 ... etc從tmp_table WHERE col1 ='{$ tableName}''。如果每個表的列數都是可變的,則只需在php中描述每個表以獲取列並僅選擇所需內容。此外,使臨時表具有您需要的最大數量的列。 –

+0

感謝喬納森的快速回答。我寧願分裂,因爲使用加載數據infile將數據導入到mysql很容易和快速,所以我正在尋找一種分割輸入文件的好方法。另外,不同塊之間的數據類型也不相同(例如,塊1中的第二個字段爲int,塊2中爲時間...)。 – Heiko

+0

@Jonathan Kuhn,我終於有時間按照你的建議。我認爲這會更復雜,但一切都平穩快速,所以謝謝你指點我正確的方向! – Heiko

回答

0

使用內置的CSV解析器,不拆這個手動 http://php.net/manual/en/function.str-getcsv.php

+0

嗯。好吧,這將把整個輸入文件放在一個巨大的數組中 - 但我仍然必須識別不同的塊並將它們保存到單獨的文本文件中,對嗎? – Heiko

+0

正確,你用這個解析數據,然後開始做你將要做的事情。 – TravisO

相關問題