У меня есть форма, которая позволяет пользователю либо загрузить текстовый файл, либо скопировать / вставить содержимое файла в текстовое поле. Я могу легко различать эти два параметра и помещать то, что они ввели, в строковую переменную, но что мне делать дальше?
Мне нужно перебрать каждую строку строки (желательно не беспокоясь о новых строках на разных машинах), убедиться, что в ней есть ровно один токен (без пробелов, табуляции, запятых и т. Д.), Очистить данные, а затем сгенерировать SQL-запрос основанный на всех строках.
Я довольно хороший программист, поэтому я знаю общее представление о том, как это сделать, но я так давно не работал с PHP, что чувствую, что ищу неправильные вещи и, таким образом, придумываю бесполезную информацию. Ключевая проблема, с которой я столкнулся, заключается в том, что я хочу построчно читать содержимое строки. Если бы это был файл, это было бы легко.
В основном я ищу полезные функции PHP, а не алгоритм, как это сделать. Какие-либо предложения?
s($myString)->normalizeLineEndings()
доступен с github.com/delight-im/PHP-Str (библиотека под лицензией MIT), в котором есть множество других полезных помощников по строкам. Вы можете взглянуть на исходный код.Ответы:
preg_split
переменную, содержащую текст, и перебрать возвращенный массив:источник
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Я хотел бы предложить значительно более быструю (и эффективную с точки зрения памяти) альтернативу:
strtok
вместоpreg_split
.Тестируя производительность, я 100 раз повторил тестовый файл с 17 тысячами строк: это
preg_split
заняло 27,7 секунды, тогда какstrtok
1,4 секунды.Обратите внимание, что, хотя
$separator
определяется как"\r\n"
,strtok
будет разделяться на любой из символов, а в PHP4.1.0 пропускать пустые строки / токены.См. Ручную запись strtok: http://php.net/strtok
источник
prey_split
неexplode
должны использоваться для получения структурированных фрагментов строки. Это все равно, что летать из базуки .strtok()
чего-то еще внутри этогоwhile
цикла приведет к поломке. Я также использовал его, чтобы захватить все в строке до первого пробела ( stackoverflow.com/a/2477411/1767412 ), и мне потребовалась минута, чтобы понять, почему все идет не так, как планировалосьЕсли вам нужно обрабатывать символы новой строки в разных системах, вы можете просто использовать предопределенную константу PHP PHP_EOL (http://php.net/manual/en/reserved.constants.php) и просто использовать explode, чтобы избежать накладных расходов на механизм регулярных выражений. ,
источник
PHP_EOL (string)
это правильный символ «Конец строки» для этой платформы.Это слишком сложно и некрасиво, но, на мой взгляд, это правильный путь:
источник
php://temp
для хранения больших данных во временном файле на диске.^ вот как правильно разбивать линии , кроссплатформенность совместима с
Regexp
:)источник
Возможные проблемы с памятью
strtok
:Поскольку одно из предложенных решений использует
strtok
, к сожалению, оно не указывает на потенциальную проблему с памятью (хотя утверждает, что оно эффективно с точки зрения памяти). При использованииstrtok
согласно инструкции :Это происходит путем загрузки файла в память. Если вы используете большие файлы, вам нужно очистить их, если вы закончили цикл по файлу.
Если вас интересуют только физические файлы (например, сбор данных):
Согласно руководству , для загрузки файла вы можете использовать
file
команду:источник
Ответ Кирилла лучше всего подходит, учитывая, что вам нужно иметь возможность обрабатывать новые строки на разных машинах.
Я часто их использую:
источник