0

次のような内容のファイルを dbpedia からダウンロードしました。

<http://dbpedia.org/resource/Selective_Draft_Law_Cases> <http://dbpedia.org/ontology/wikiPageExternalLink>        <http://supreme.justia.com/cases/federal/us/245/366/> .
<http://dbpedia.org/resource/List_of_songs_recorded_by_Shakira> <http://dbpedia.org/ontology/wikiPageExternalLink> <http://www.shakira.com/> .
<http://dbpedia.org/resource/Bucharest_Symphony_Orchestra>   <http://dbpedia.org/ontology/wikiPageExternalLink> <http://www.symphorchestra.ro/> .
<http://dbpedia.org/resource/Bucharest_Symphony_Orchestra> <http://dbpedia.org/ontology/wikiPageExternalLink> <http://symphorchestra.ro> .
<http://dbpedia.org/resource/Bucharest_Symphony_Orchestra> <http://dbpedia.org/ontology/wikiPageExternalLink> <http://www.youtube.com/symphorchestra> .

各行の最初の部分 (つまりSelective_draft_Law_Cases、最初の行、2 番目の List_of_songs_etc など) からタイトルを抽出し、同じ行の 3 番目の要素である URL と共に mysql テーブルに保存する必要があります。2 行目1 行目 など。

また、無関係な情報が含まれているファイルの最初の行をスキップする必要もあります。

これを PHP で行う最速の方法は何ですか?

注: このファイルは非常に大きいものです (サイズが 1 GB 以上、600 万行以上)。

前もって感謝します!

4

2 に答える 2

1

最適化できると確信していますが、それは始まりです。試す:

function insertFileToDb(){
    $myFile = "myFile.txt"; //your txt file containing the data
    $handle = fopen($myFile, 'r');

    //Read first line, but do nothing with it
    $contents = fgets($handle);

    //now read the rest of the file line by line
    while(!feof($handle)){
       $data = fgets($handle);

       //remove <> characters
       $vowels = array("<", ">");
       $data = str_replace($vowels, "", $data);

       //remove spaces to a single space for each line
       $data = preg_replace('!\s+!', ' ', $data);

       /*
        * Get values from array, 1st URL is $dataArr[0] and 2nd URL is $dataArr[2]
        * Explode on ' ' spaces
       */
       $dataArr = explode(" ", $data);

       //Get last part of uri from 1st element in array
       $title = $this->getLastPartOfUrl($dataArr[0]);   

       //Execute your sql query with $title and $dataArr[2] which is the url
       INSERT INTO `table` ...
    } 
    fclose($handle);
} 

function getLastPartOfUrl($url){
   $keys = parse_url($url); // parse the url
   $path = explode("/", $keys['path']); // splitting the path
   $last = end($path); // get the value of the last element
   return $last;
}
于 2013-02-11T15:20:20.443 に答える
1

正規表現を使用し、PHP のpreg_match関数を使用する必要があります。ファイルが大きすぎる場合 (これはあなたのケースのようです)、fopen + fgets + fcloseを使用して、ファイル全体がメモリと作業ラインに読み込まれないようにすることをお勧めします。行ごと。

ファイルの読み取りのためにfile_get_contentsのパフォーマンスをテストすることもできますが、大量のメモリが必要になるため、これはあなたのケースではより高速な方法ではないようです。

于 2013-02-11T14:59:16.833 に答える