Проблемы с 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
будет массив со значениями каждого поля.