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})匹配前 10 个数字 0-9,

([0-9]{3}\.[0-9]{2})匹配下一组具有 3 个数字 0-9 的数字,然后是一个句点,然后是 2 个数字 0-9

$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();

逐行阅读并使用explode

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()被初始化,然后每个后续调用都会为您提供下一个令牌。所以$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”

您可以简单地将结果转换为intor 使用int_val()

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

我认为您应该研究 file() 和explode()。File() 将为您将文件的每一行读入一个数组,然后您可以使用explode() 来获取空格和小数点。

于 2013-07-25T19:34:21.283 回答
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+- 匹配一位或多位数字
  • )- 关闭捕获组
  • (- 打开另一个组(我们将把这个组设为可选)
  • \.- 匹配文字.
  • \d+- 匹配一位或多位数字
  • )- 关闭捕获组
  • ?- 使前面的组可选(1303100650 115如果需要,这允许字符串,如 )
  • $- 匹配字符串结尾

这些示例仅适用于一个字符串。显然,您需要循环执行此操作(或仅使用preg_match_all)。

于 2013-07-25T19:38:09.543 回答