Eu tenho um formulário que permite ao usuário fazer upload de um arquivo de texto ou copiar / colar o conteúdo do arquivo em uma área de texto. Posso diferenciar facilmente os dois e colocar o que eles inseriram em uma variável de string, mas para onde vou a partir daí?
Eu preciso iterar sobre cada linha da string (de preferência não se preocupar com novas linhas em máquinas diferentes), garantir que ele tenha exatamente um token (sem espaços, tabulações, vírgulas etc.), higienizar os dados e gerar uma consulta SQL com base em todas as linhas.
Sou um bom programador, por isso conheço a idéia geral de como fazê-lo, mas faz tanto tempo desde que trabalhei com PHP que sinto que estou procurando as coisas erradas e, assim, obtendo informações inúteis. O principal problema que estou enfrentando é que quero ler o conteúdo da string linha por linha. Se fosse um arquivo, seria fácil.
Estou procurando principalmente funções úteis do PHP, não um algoritmo de como fazê-lo. Alguma sugestão?
s($myString)->normalizeLineEndings()
está disponível no github.com/delight-im/PHP-Str (biblioteca sob licença MIT), que possui muitos outros auxiliares de seqüência de caracteres úteis. Você pode dar uma olhada no código fonte.Respostas:
preg_split
a variável que contém o texto e itere sobre a matriz retornada:fonte
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Eu gostaria de propor uma alternativa significativamente mais rápida (e eficiente em termos de memória): em
strtok
vez depreg_split
.Testando o desempenho, iterei 100 vezes em um arquivo de teste com 17 mil linhas:
preg_split
demorou 27,7 segundos, enquantostrtok
demorou 1,4 segundos.Note que, embora o
$separator
definido como"\r\n"
,strtok
seja separado em qualquer caractere - e a partir do PHP4.1.0, pule linhas / tokens vazios.Veja a entrada manual do strtok: http://php.net/strtok
fonte
prey_split
nemexplode
deve ser usado para a preparação de fragmentos de cordas estruturados. É como mirar uma mosca com uma bazuca .strtok()
algo mais dentro dessewhile
loop quebrará as coisas. Eu também estava usando-o para tudo agarrar em uma corda até o primeiro espaço ( stackoverflow.com/a/2477411/1767412 ) e me levou um minuto para perceber por que as coisas não estavam indo como planejadoSe você precisar lidar com novas linhas em sistemas diferentes, basta usar a constante PHP_EOL constante do PHP (http://php.net/manual/en/reserved.constants.php) e simplesmente usar explodir para evitar a sobrecarga do mecanismo de expressão regular .
fonte
PHP_EOL (string)
é o símbolo 'End Of Line' correto para esta plataforma.É muito complicado e feio, mas na minha opinião, este é o caminho a seguir:
fonte
php://temp
para armazenar dados maiores em um arquivo de disco temporário.^ é assim que você quebra as linhas corretamente , compatível com várias plataformas
Regexp
:)fonte
Problemas potenciais de memória com
strtok
:Como uma das soluções sugeridas é usada
strtok
, infelizmente ela não indica um problema de memória em potencial (embora afirme ser eficiente em termos de memória). Ao usar destrtok
acordo com o manual , o:Isso é feito carregando o arquivo na memória. Se você estiver usando arquivos grandes, precisará liberá-los se terminar de percorrer o arquivo.
Se você está preocupado apenas com arquivos físicos (por exemplo, datamining):
De acordo com o manual , para a parte de upload de arquivo, você pode usar o
file
comando:fonte
A resposta de Kyril é melhor, considerando que você precisa lidar com novas linhas em máquinas diferentes.
Eu uso muito isso:
fonte