проблемы с sscanf и пробелами - PullRequest
0 голосов
/ 15 февраля 2012

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

Декорация.

Файл 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 (за которым следует пробел в одном случае и <в другом). </p>

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

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

1 Ответ

0 голосов
/ 15 февраля 2012

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

Пример:

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

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

PHP - preg_split ()

...