Вставка пробела через 2 знака после запятой в строке - PullRequest
2 голосов
/ 29 ноября 2011

В 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 пробела после этого, и если там нет пробела, мне нужно добавить один. Я просто не могу за свою жизнь найти самый прямой способ сделать это.

Ответы [ 6 ]

1 голос
/ 29 ноября 2011

Я бы использовал регулярное выражение:

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

DEMO

0 голосов
/ 29 ноября 2011

вы можете использовать preg_split () для создания массива строки, используя регулярное выражение

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

Это позволит найти все экземпляры ####. ## и не беспокоиться о пробелах

0 голосов
/ 29 ноября 2011

Это делает то, что вы хотите.Вероятно, не самый эффективный способ сделать это, хотя.

<?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 голосов
/ 29 ноября 2011
$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 голосов
/ 29 ноября 2011

Это файл с фиксированной шириной столбца.Я бы проанализировал их по 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 голосов
/ 29 ноября 2011

Я бы сделал что-то вроде этого, скажем, строка десятичных дробей находится в переменной с именем $ line:

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

Теперь у вас есть массив десятичных значений, поэтому

$parts[0] = "1.45"
(float)$parts[0] = 1.45
$parts[1] = "122.87"
(float)$parts[1] = 122.87
// etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...