0

私はfile.datを持っていて、そのフォーマットは

1303100643 115.83
1303100644 115.94
1303100645 115.80
1303100646 115.99
1303100647 115.74
1303100648 115.11

これは、たとえば最初の行で正しい整数を取得しようとしているphpコードです。値「115」のみを取得したい

while (!feof($file_handle) ) {
    set_time_limit(0);
    $line_of_text = fgets($file_handle, 1024);
    $reading=strtok($line_of_text[0]," ");
    echo $reading[0];
}

私がreading[0]結果を使用する場合は"1"

そのreading[1]上でエラーが発生します

「SCREAM: エラー抑制は無視されました ( ! )

注意: 初期化されていない文字列オフセット: 16 行目の C:\wamp\www\Delta Compression\MaxLength.php の 1"

4

4 に答える 4

2

正規表現を使ったほうが早い

$data = file_get_contents("file.txt");
preg_match_all("/([0-9]{10}) ([0-9]{3}\.[0-9]{2})/",$data,$Matches);

//Use below if you want an associative array with the first 10 numbers 
//being the keys and the second numbers being the values
$myData = array_combine($Matches[1],$Matches[2]);

([0-9]{10})0 ~ 9 の最初の 10 個の数字に一致します。

([0-9]{3}\.[0-9]{2})0 ~ 9 の 3 つの数字、ピリオド、さらに 0 ~ 9 の 2 つの数字の次の数字のセットに一致します。

$Matches は

Array
(
    [0] => Array
        (
            [0] => 1303100643 115.83
            [1] => 1303100644 115.94
            [2] => 1303100645 115.80
            [3] => 1303100646 115.99
            [4] => 1303100647 115.74
            [5] => 1303100648 115.11
        )

    [1] => Array
        (
            [0] => 1303100643
            [1] => 1303100644
            [2] => 1303100645
            [3] => 1303100646
            [4] => 1303100647
            [5] => 1303100648
        )

    [2] => Array
        (
            [0] => 115.83
            [1] => 115.94
            [2] => 115.80
            [3] => 115.99
            [4] => 115.74
            [5] => 115.11
        )

)

コード対コード:

ジェイソン・マクレアリー

$time1=microtime();
$mydata = array();
$file_handle = fopen("data.txt","r");

while (!feof($file_handle) ) {
    set_time_limit(0);
    $line_of_text = fgets($file_handle, 1024);
    $reading=explode(" ", $line_of_text);

    $mydata[] = $reading;
}
fclose($file_handle);
$time2 =microtime();

行ごとの読み取りと爆発の使用

1374728889 0.20137600  :: 1374728889 0.20508800 
0.20508800
0.20137600
----------
0.00371200

私の

$time1=microtime();

$data = file_get_contents("data.txt");
preg_match_all("/([0-9]{10}) ([0-9]{3}\.[0-9]{2})/",$data,$Matches);
$myData = array_combine($Matches[1],$Matches[2]);

$time2=microtime();

echo $time1." :: ".$time2;   

fgc と正規表現の使用

1374728889 0.20510100  :: 1374728889 0.20709000 
0.20709000
0.20510100
----------
0.00198900 
于 2013-07-25T19:34:51.643 に答える
1

あなたはstrtok()適切に使用していません。strtok()が初期化され、その後の各呼び出しで次のtokenが提供されます。$reading[0]文字列の最初の文字を実際に引っ張っています。

strtok()likeを使用しているexplode()ので、次を使用してexplode()ください。

while (!feof($file_handle) ) {
    set_time_limit(0);
    $line_of_text = fgets($file_handle, 1024);
    $reading=explode(" ", $line_of_text[0]);
    echo $reading[0];
}

「115」という値だけを取得したい

結果を単にキャストするintか、次のように使用できますint_val()

echo (int)$reading[1];
于 2013-07-25T19:32:28.400 に答える
1

他の回答が示唆しているように、を使用するexplodeか、スペースと小数点の位置substrを取得し、それらの間の文字を取得するために使用できます。入力が一貫していると仮定すると、strposまたはstrrposこれで機能します。

$line = '1303100643 115.83';

$space_pos   = strrpos($line, ' ');
$decimal_pos = strrpos($line, '.');

$number = substr($line, $space_pos, $space_pos + count($line) - $decimal_pos);

別のアプローチは、スペースの後にすべてを取得し、そのフロアを取るか、整数にキャストすることです。幸いなことに、前の例と同じ関数を使用して、読みやすいワンライナーでこれを行うことができます。

$number = (int)substr($line, strrpos($line, ' '));

または、正規表現を使用することもできます。これは、正規表現に精通している場合、おそらく最も簡単なオプションです。

if (preg_match('|(\d+)(\.\d+)?$|', $line, $matches)) {
    $number = $matches[0];
}

その正規表現を分解します...

  • (- グループを開く (内容は に入る$matches[0])
  • \d+- 1 つ以上の数字に一致
  • )- キャプチャ グループを閉じる
  • (- 別のグループを開きます (このグループはオプションにします)
  • \.- リテラルに一致.
  • \d+- 1 つ以上の数字に一致
  • )- キャプチャ グループを閉じる
  • ?- 前のグループをオプションにします (これにより1303100650 115、必要に応じて のような文字列が許可されます)
  • $- 文字列の末尾に一致

これらの例は、1 つの文字列のみを対象としています。明らかに、これをループで実行する必要があります (または単に を使用しますpreg_match_all)。

于 2013-07-25T19:38:09.543 に答える
1

file()とexplode()を調べる必要があると思います。File() は、ファイルの各行を配列に読み込みます。次に、スペースと小数点に Explode() を使用できます。

于 2013-07-25T19:34:21.283 に答える