사용자가 텍스트 파일을 업로드하거나 파일 내용을 텍스트 영역에 복사 / 붙여 넣을 수있는 양식이 있습니다. 두 가지를 쉽게 구별하고 문자열 변수에 입력 한 것을 넣을 수는 있지만 어디로 가야합니까?
문자열의 각 줄을 반복하고 (바람직하게는 다른 컴퓨터의 줄 바꿈에 대해 걱정하지 않아야 함) 정확히 하나의 토큰 (공백, 탭, 쉼표 등 없음)이 있는지 확인하고 데이터를 삭제 한 다음 SQL 쿼리를 생성해야합니다 모든 라인을 기반으로합니다.
나는 꽤 좋은 프로그래머이므로 그것을하는 방법에 대한 일반적인 아이디어를 알고 있지만 PHP로 작업한지 너무 오래되어 잘못된 것을 찾고 있다고 생각하여 쓸모없는 정보가 떠 오릅니다. 내가 가지고있는 주요 문제는 문자열의 내용을 한 줄씩 읽고 싶다는 것입니다. 파일이라면 쉬울 것입니다.
나는 주로 유용한 PHP 함수를 찾고 있는데, 그 방법에 대한 알고리즘이 아닙니다. 어떤 제안?
답변
preg_split
텍스트가 포함 된 변수를 반환하고 반환 된 배열을 반복합니다.
foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){
// do stuff with $line
}
답변
내가 제안하고 싶은 크게 : 빠른 (메모리 효율) 대안 strtok
보다는 preg_split
.
$separator = "\r\n";
$line = strtok($subject, $separator);
while ($line !== false) {
# do something with $line
$line = strtok( $separator );
}
성능을 테스트하면서 17,000 줄의 테스트 파일을 100 번 반복 preg_split
했습니다 .27.7 초가 걸렸습니다 .strtok
1.4 초가 걸렸습니다.
참고있는이 비록 $separator
같이 정의된다 "\r\n"
,strtok
그리고 PHP4.1.0의 비어 선 / 토큰을 건너 – 중 캐릭터에 분리됩니다.
strtok 매뉴얼 항목을 참조하십시오 :
http://php.net/strtok
답변
다른 시스템에서 줄 바꿈을 처리 해야하는 경우 단순히 PHP 사전 정의 상수 PHP_EOL (http://php.net/manual/en/reserved.constants.php)을 사용하고 정규 표현식 엔진의 오버 헤드를 피하기 위해 explode를 사용하면됩니다 .
$lines = explode(PHP_EOL, $subject);
답변
지나치게 복잡하고 추악하지만 제 생각에는 이것이 갈 길입니다.
$fp = fopen("php://memory", 'r+');
fputs($fp, $data);
rewind($fp);
while($line = fgets($fp)){
// deal with $line
}
fclose($fp);
답변
foreach(preg_split('~[\r\n]+~', $text) as $line){
if(empty($line) or ctype_space($line)) continue; // skip only spaces
// if(!strlen($line = trim($line))) continue; // or trim by force and skip empty
// $line is trimmed and nice here so use it
}
^ 이것은 라인을 올바르게 나누는 방법 이며, 크로스 플랫폼과 호환됩니다 Regexp
🙂
답변
잠재적 메모리 문제 strtok
:
제안 된 솔루션 중 하나 strtok
가을 사용하기 때문에 불행히도 잠재적 인 메모리 문제를 지적하지는 않습니다 (메모리 효율적이라고 주장하지만). 매뉴얼strtok
에 따라 사용 하는 경우 :
strtok에 대한 첫 번째 호출 만 문자열 인수를 사용합니다. strtok에 대한 모든 후속 호출 은 현재 문자열의 위치를 추적하므로 사용할 토큰 만 있으면됩니다 .
파일을 메모리에로드하여이를 수행합니다. 큰 파일을 사용하는 경우 파일을 반복하면 파일을 플러시해야합니다.
<?php
function process($str) {
$line = strtok($str, PHP_EOL);
/*do something with the first line here...*/
while ($line !== FALSE) {
// get the next line
$line = strtok(PHP_EOL);
/*do something with the rest of the lines here...*/
}
//the bit that frees up memory
strtok('', '');
}
실제 파일에만 관심이있는 경우 (예 : 데이터 마이닝) :
manual에 따르면 파일 업로드 부분에 대해 다음 file
명령을 사용할 수 있습니다 .
//Create the array
$lines = file( $some_file );
foreach ( $lines as $line ) {
//do something here.
}
답변
Kyril의 대답은 다른 컴퓨터에서 줄 바꿈을 처리해야한다는 점을 고려하는 것이 가장 좋습니다.
“저는 유용한 PHP 함수를 찾고 있는데, 그 방법에 대한 알고리즘이 아닙니다. 어떤 제안이 있습니까?”
나는 이것을 많이 사용합니다 :
- 터지다() 를 사용하면 단일 구분 기호를 사용하여 문자열을 배열로 분할 할 수 있습니다.
- implode ()는 폭발에서 대응하는 배열로 배열에서 문자열로 돌아갑니다.