2011-11-29 67 views
2

在PHP中,我导入一些文本文件,其中包含以空格分隔的浮点值表。所有值都包含两个小数位。一个典型的行会是这样的:在一个字符串中插入一个空格2位后小数

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

您的意思是它既没有分隔也没有固定宽度? –

+0

总是有2个数字在“。”之后? – powtac

+1

它是空格分隔的,但并非总是如此,小数点后总有2位数字。 – Laravelian

回答

1

我会用正则表达式:

$pattern = "/(-)?\d{1,}\.\d{2}/"; 
    preg_match_all($pattern, "1.45122.87 99.12 19.55", $matches); 
    print_r($matches); 

DEMO

+0

将模式更改为“/(-)?d{1,}\.\d{2}/”以解释负值,并且这种方式就像魅力一样! – Laravelian

-2

我会做这样的事情,说的小数行是一个变量,名为$行:

$parts = explode(' ', $line); 

现在你有小数数值数组,所以

$parts[0] = "1.45" 
(float)$parts[0] = 1.45 
$parts[1] = "122.87" 
(float)$parts[1] = 122.87 
// etc... 
+0

并非所有数字都包含它们之间的空格。 – Brad

+0

我会得到的将是$ parts [0] = 1.45122.87我想要做的是将字符串INTO 1.45 1.22,而不是它。 – Laravelian

+0

为什么你不能只备份和重新处理原始文件? –

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数组。这是未经测试的,但应该工作。

+0

$ x没有在您的循环中增加 –

+0

@AdamBailin,谢谢,修正。 – Brad

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" 
    } 

*/ 
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; 
?> 
0

你可以使用使preg_split()使用正则表达式

$lineArray = preg_split("/(\d+(\.\d{1,2})?)/", $lineOfNumbers); 

这会发现####的所有实例创建线组成的数组。##,而不用担心空间

相关问题