2016-04-03 31 views
0

私はcsvに変換したい形式のテキストファイルがありません。このフォームでおおよそですphp - ひどくフォーマットされたtxtをcsvに変換する

100910 NA/1-2013-99636 VIA DEI PESCATORI 2/A LODI APR 8 2013 4:24PM DANNEGGIATO -10% 200 2700 0 0 NO 
148013 NA/1-2014-146194 CAVALLOTTI SNC LODI GEN 3 2014 3:37PM DANNEGGIATO -10% 0 0 2 0 NO 
160032 NA/1-2014-158129 PAOLO GORINI SNC LODI MAG 6 2014 11:51AM DANNEGGIATO -10% 2 0 2 0 NO 
54900 NA/1-2014-158070 STRADA VECCHIA CREMONESE SNC LODI MAG 6 2014 9:53AM DANNEGGIATO +10% 10 0 10 0 NO 
100910 NA/1-2013-99636 VIA DEI PESCATORI 2/A LODI APR 8 2013 4:24PM DANNEGGIATO -10% 200 2700 0 0 NO 
147959 NA/1-2014-146140 DOSSENA SNC LODI GEN 3 2014 10:45AM DANNEGGIATO -10% 200 0 200 0 NO 

[number] [id] [awfully formatted street] ['LODI'] [timestamp] [damaged or not] [percentage] [squaremeters] [squaremeters] [squaremeters] [squaremeters] [asbest-crumbled or not] 

私の問題は、第3部、[ひどくフォーマットされた通り]を抽出する方法である

は、ここでの例です。 基本的には、文字列['LODI']の前の[id]の後の文字列です(しかし[[LODI]]は[タイムスタンプ]の直前でなければなりません)。

各行をスペースで区切り、 [timestamp]を追い越し、[[LODI]]を追い越して配列[id]、すなわち配列[1]の前に値を結合しますか?または、これを行うためのスマートな(エレガントな)方法がありますか?おそらくpreg_match()ですか?

ありがとうございました!

+0

が '' LODI' – splash58

答えて

0
<?php 
    // read file line by line 
    $line = '148013 NA/1-2014-146194 CAVALLOTTI SNC LODI GEN 3 2014 3:37PM DANNEGGIATO -10% 0 0 2 0 NO'; 

    //start by seperating the string on LODI 
    $lodi_split = explode('LODI', $line); 

    // Now split the first occ into an array on space 
    $bits = explode(' ', $lodi_split[0]); 

    $address = ''; 
    // start reading occurance from occ 2 to loose the first 2 fields 
    for ($i=2; $i < count($bits); $i++) { 
     $address .= $bits[$i] . ' '; 
    } 
    echo $address . PHP_EOL; 

結果は

CAVALLOTTI SNC 
0

これは、行からアドレスを抽出するために有効です。

<?php 
$row = "100910 NA/1-2013-99636 VIA DEI PESCATORI 2/A LODI APR 8 2013 4:24PM DANNEGGIATO -10% 200 2700 0 0 NO"; 
$row_array = preg_split('/\s+/', $row); 


array_shift($row_array); 
array_shift($row_array); 

for($i=0; $i<12; $i++){ 
    array_pop($row_array); 
} 

$address = implode(" ", $row_array); 

?> 
0

はここでは行いません。私はregexpを使用して提案します。たとえば、あなたが(データ列を\ nに分離されている)1つの文字列としてご .txtファイルの読み取り場合:次に

$f = fopen($fname="file.txt", "rt"); 
$str = fread($f, filesize($fname))); 
fclose($f); 

このようなpreg_match_all()を使用します。

$re = "/^(\\d+)\\s*(.*)(LODI)\\s*(.+(?:AM|PM))\\s*(\\w+)\\s+(-?\\d{1,3}%)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\w+)$/m"; 
preg_match_all($re, $str, $matches,PREG_SET_ORDER); 
echo "<pre>\n"; 
print_r($matches); 
echo "</pre>\n"; 

出力はなりますが

Array 
(
    [0] => Array 
     (
      [0] => 100910 NA/1-2013-99636 VIA DEI PESCATORI 2/A LODI APR 8 2013 4:24PM DANNEGGIATO -10% 200 2700 0 0 NO 
      [1] => 100910 
      [2] => NA/1-2013-99636 VIA DEI PESCATORI 2/A 
      [3] => LODI 
      [4] => APR 8 2013 4:24PM 
      [5] => DANNEGGIATO 
      [6] => -10% 
      [7] => 200 
      [8] => 2700 
      [9] => 0 
      [10] => 0 
      [11] => NO 
     ) 

    [1] => Array 
     (
      [0] => 148013 NA/1-2014-146194 CAVALLOTTI SNC LODI GEN 3 2014 3:37PM DANNEGGIATO -10% 0 0 2 0 NO 
      [1] => 148013 
      [2] => NA/1-2014-146194 CAVALLOTTI SNC 
      [3] => LODI 
      [4] => GEN 3 2014 3:37PM 
      [5] => DANNEGGIATO 
      [6] => -10% 
      [7] => 0 
      [8] => 0 
      [9] => 2 
      [10] => 0 
      [11] => NO 
    ) 
..........// And so on 

この例では、上記のテキストを使用しました。したがって、出力では配列のリストとして整形されたデータを受け取ります。だから、あなたが望むことは何でもできます。 $ matches [$ i] [0] - マッチ全体を保存するので、スキップして$ matches [$ i] [1] .... $をデータとして使用します。

+0

ええ、おかげでexplode'です。これは最初の選択グループ(。*)が非常に欲張りです(最後の行までかなりのファイルにマッチします)。そして、preg_match_all()は常に最後の行だけを返します。パターン)。 preg_match_allにmというフラグが立てられていることを考えると、かなり奇妙です。 –

関連する問題