テキストファイルには、次の文字列があります。
ID | LABEL | A | B | C
--------------------------------------
9999 | Oxygen Isotopes | | 0.15 | 1
8733 | Enriched Uranium | | 1 | 1
ID
正規表現を使用してフィールドとLABEL
各行を抽出したいと思います。
どうすればそれを達成できますか?
テキストファイルには、次の文字列があります。
ID | LABEL | A | B | C
--------------------------------------
9999 | Oxygen Isotopes | | 0.15 | 1
8733 | Enriched Uranium | | 1 | 1
ID
正規表現を使用してフィールドとLABEL
各行を抽出したいと思います。
どうすればそれを達成できますか?
なぜ正規表現を主張したのかわかりません。
列が|で区切られているように見えるため シンボル、PHP関数explodeを使用する方が簡単な解決策のようです。
行をループして、一般的な配列の添字表記を使用して各列を参照できます。たとえば$line[0]
、$line[1]
IDとLABELをそれぞれ使用できます。
ここで正規表現が最善の解決策であるとは思えません。
これを試して、テキストファイルを行の配列に分割します(これは、txtファイルを作成したマシンのOSに応じて、機能する場合と機能しない場合があります)
$lines = explode($text, "\n");
$final_lines = array();
foreach ($lines as $line) {
$parts = explode($line, " | ");
$final_lines[] = $parts;
}
これで、次のように、行番号、次に列を介してすべてのデータにアクセスできます。
$final_lines[2][0]
8733が含まれます。
すべての行で使用できますpreg_split
:
$array = preg_split(`/\s*\|\s*/`, $inputLine, 2);
次に、djdy's answer のように、ID は に$array[0]
、ラベルは になり$array[1]
ます。
正規表現は必要ありません:
<?php
$file = file('file.txt');
$ret = array();
foreach($file as $k=>$line){
if($k<2){continue;}
list($ret['ID'][],
$ret['LABEL'][],
$ret['A'][],
$ret['B'][],
$ret['C'][]) = explode('|',$line);
}
print_r($ret);
//Label: Oxygen Isotopes ID:9999
echo 'Label: '.$ret['LABEL'][0].' ID:'.$ret['ID'][0];
/*
Array
(
[C] => Array
(
[0] => 1
[1] => 1
)
[B] => Array
(
[0] => 0.15
[1] => 1
)
[A] => Array
(
[0] =>
[1] =>
)
[LABEL] => Array
(
[0] => Oxygen Isotopes
[1] => Enriched Uranium
)
[ID] => Array
(
[0] => 9999
[1] => 8733
)
)
*/
?>
ここで正規表現を使用するのは最善の方法ではありませんが、次のようになります。
preg_match_all("/(\d{4}.?)\|(.*?)\|/s", $data, $matchs)
の2番目と3番目のインデックスは$matches
必要なデータを運びます
ここでは、正規表現は最善の方法ではない可能性があります。各行を文字列として読み取り、String.explode("|", input) を使用して文字列の配列を作成します。インデックス 0 は ID、インデックス 1 はラベルです。必要に応じて、A、B、C についても同様です。これは、正規表現を使用するよりも堅牢なソリューションです。
ID を取得する正規表現は次のようになります。
\d{4} |
ラベル フィールドに対して同様のことを行うことができますが、これもバグです。これは、explode を使用するほど堅牢ではありません。
試す
$str = file_get_contents($filename);
preg_match_all('/^\s*(\d*)\s*\|\s*(.*?)\s*\|/m', $str, $matches);
// $matches[1] will have ids
// $matches[2] will have labels