Проблемы с sscanf и пробелами

Я действительно схожу с ума из-за проблемы, которую, надеюсь, вы поможете мне решить.

Декорация.

Файл php читает некоторые данные в текстовом файле и заполняет базу данных mysql. Для этого я использовал функцию "sscanf" и все работает очень хорошо... но не всегда! Из-за небольшой разницы в формате некоторых файлов текстовых данных поля в базе данных заполнены неправильно.

Вот пример:

Это общая строка файла данных.txt:

...
<name:4>John <country:3>USA <age:2>20
...

Чтобы прочитать данные в файле и заполнить базу данных MyQSL, я использую функцию sscanf, за которой следуют конкретные параметры, как показано в следующих примерах:

 $values = sscanf ($s, "<name:%d>%s ", $length,$personal_data['name']);
 $values = sscanf ($s, "<country:%d>%s ", $length,$personal_data['country']);
 $values = sscanf ($s, "<age:%d>%s ", $length,$personal_data['age']);

Эти параметры в порядке, и база данных MyQSL заполнена правильно; каждое поле имеет свои данные. ИМЯ -> "Джон" - СТРАНА -> "США" - ВОЗРАСТ "20"

К сожалению, текстовые файлы, содержащие мои данные, немного отличаются, хотя используют один и тот же формат. Вот еще один пример:

 <name:4>John<country:3>USA<age:2>20

В этом случае функция sscanf с идентичными параметрами, использовавшимися ранее, работает неправильно. Все поля в базе данных имеют неверные данные. Это связано с тем, что в конце каждого поля исходного файла нет пробелов (.txt). База данных будет заполнена следующим образом. ИМЯ -> "Джон"ry:3> США "- ВОЗРАСТ"

Поэтому я должен изменить параметры sscanf следующим образом:

 $values = sscanf ($s, "<name:%d>%s<", $length,$personal_data['name']);
 $values = sscanf ($s, "<country:%d>%s<", $length,$personal_data['country']);
 $values = sscanf ($s, "<age:%d>%s<", $length,$personal_data['age']);

и все снова в порядке.

Проблема в пустом пространстве. В некоторых.txt файлах присутствует после каждого поля, а в других файлах нет. Вы можете заметить различия после параметра% s (за которым следует пробел в одном случае и <в другом).

Как я могу решить проблему? Есть ли способ сообщить sscanf, что в текстовом исходном файле каждое поле заканчивается пробелом или

Заранее спасибо, Мэтью

1 ответ

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

Пример:

$str = '<name:4>John<country:3>USA<age:2>20';
$values = preg_split('/<[a-z]+:\d>/', $str);

$data будет массив со значениями каждого поля.

PHP - preg_split ()

Другие вопросы по тегам