在PHP中,我导入一些文本文件,其中包含以空格分隔的浮点值表。所有值都包含两个小数位。典型的线条如下所示:
1.45 22.87 99.12 19.55
但是,有些行,如果小数点前的数字是3位数,原始文件有时不包含空格。那应该是什么:
1.45 122.87 99.12 19.55
以:
进来1.45122.87 99.12 19.55
我认为我需要做的是搜索字符串中的小数,然后查看2个空格,如果没有空格,我需要添加一个空格。我不能为我的生活找出最直接的方法。
答案 0 :(得分:1)
我会使用正则表达式:
$pattern = "/(-)?\d{1,}\.\d{2}/";
preg_match_all($pattern, "1.45122.87 99.12 19.55", $matches);
print_r($matches);
答案 1 :(得分:0)
这是一个固定列宽文件。我会通过substr()
解析这些。
http://php.net/manual/en/function.substr.php
for ($x=0; $x<strlen($line); $x+=4) {
$parts[] = trim(substr($line, $x, 4));
}
这将为您提供所有字段$parts
中的数组。这是未经测试的,但应该有效。
答案 2 :(得分:0)
$line = '1.45122.87 99.12 19.55';
preg_match_all('~([0-9]{1,3}\.[0-9]{2})~', $line, $matches);
var_dump($matches[1]);
/*
Result:
array(4) {
[0]=>
string(4) "1.45"
[1]=>
string(6) "122.87"
[2]=>
string(5) "99.12"
[3]=>
string(5) "19.55"
}
*/
答案 3 :(得分:0)
这就是你想要的。可能不是最有效的方法。
<?php
$line = "1.45122.87 99.12 19.55";
$length = strlen($line);
$result = '';
$i=0;
while ($i<$length)
{
if ($line[$i] == '.')
{
$result .= $line[$i];
$result .= $line[$i+1];
$result .= $line[$i+2];
$result .= ' ';
$i += 3;
}
else if ($line[$i] == ' ')
{
$i++;
}
else
{
$result .= $line[$i];
$i++;
}
}
echo $result;
?>
答案 4 :(得分:0)
你可以使用preg_split()来创建一个使用正则表达式
的行数组$lineArray = preg_split("/(\d+(\.\d{1,2})?)/", $lineOfNumbers);
这将找到####。##的所有实例,而不用担心空格
答案 5 :(得分:-2)
我会做这样的事情,比如小数行是在一个名为$ line的变量中:
$parts = explode(' ', $line);
现在你有一个小数值数组,所以
$parts[0] = "1.45"
(float)$parts[0] = 1.45
$parts[1] = "122.87"
(float)$parts[1] = 122.87
// etc...