2012-04-25 21 views
1

次のデータをMySQLデータベースから抽出してラベルを作成しています。印刷する行番号に基づいてファイルを作成する

 

BREAK 

Name:RAJ 
Company:ABC 
Order Number:101 

Order Details: 
Item1 
Item20 
Item3 

BREAK 

Name:RAJ 
Company:ABC 
Order Number:101 

Order Details: 
2 x Item1 
2 x Item2 
2 x Item3 

BREAK 

Name:RAJ 
Company:ABC 
Order Number:101 

Order Details: 
5 x Item4 
5 x Item5 
5 x Item2 

私はPHPでBREAKの位置を見つけるためにいくつかのコードを書いており、以下のような行番号を生成することができます。

 
2 
14 
26 
36 

1ファイルでは2行目から14行目まで、1ファイルでは26行目から36行目までの内容のファイルが必要です。私はphpで作業していますが、この出力を読み込んでsedコマンドを生成すると、最初に2つの数値が得られませんでしたが、shell_exec関数からsedを使用しようとしました。

私が期待していることは以下のとおりです。

 
sed -n 2,14p file1.txt 
sed -n 26,36p file2.txt 

phpまたはシェルスクリプトのいずれかの提案ですか?

+0

私は先に進んで、*作成*ではなく*作成*ファイルではないと仮定しました。 :) – Christian

答えて

0

array_slice()を使用して配列内の範囲を取得します。 私のソリューションはあなたの要求に非常に強く結びついています。つまり、すべての最初の行は開始範囲番号で、次の範囲は終了範囲です。

// the lines from which will be read 
$lines = "1 
5 
16 
26"; 
// split these numbers above into an array 
$lines = explode(PHP_EOL, $lines); 

// the source file where the ranges will be taken off 
$file = file('file.txt'); 


for($i = 0; $i < count($lines); $i+=2) { 
    $rangeStart = $lines[$i]; 
    $rangeLength = $lines[$i+1] - $lines[$i]; 

    // slice out the ranges, beware the second parameter is the length not the offset! 
    $ranges[] = array_slice($file, $rangeStart, $rangeLength); 

} 

print_r($ranges); 

しかし、あなたのソースファイル/テキスト/文字列に自動的にそれを行うことたくさん容易になるだろう(?)直接、これが可能である場合。

$file = file('file.txt'); 
$len = count($file); 

$output = array(); 
$current = array(); 
for($i = 0; $i < $len; $i++) { 
    $data = trim($file[$i]); 

    if ($data != 'BREAK') { 
    $current[] = $data; 
    } else { 
    $output[] = implode(PHP_EOL, $current); 
    $current = array(); 
    } 
} 

print_r($output); 
関連する問題