문제

A.CSV 파일의 데이터를 텍스트로 웹 페이지에서 OUPUT로 읽으려고합니다.

내가이 일을 처음으로하고 불쾌한 작은 문제가 발생합니다.

내 .CSV 파일 (기본적으로 Excel에 의해 개방 된), 여러 행이 있으며 전체를 하나의 긴 문자열로 읽습니다.

이와 같이:

$contents = file_get_contents("files/data.csv");

이 예제에 내가 만든 파일에는 2 줄이 있습니다.

Paul Blueberryroad 85 미국 손전등, 가방 2008 년 11 월 20 일, 오후 4:39

Hellen Blueberryroad 85 US Lens13mm, 손전등, 가방, 외부 2008 년 11 월 20 일, 16:41:32

그러나 PHP가 읽은 문자열은 다음과 같습니다.

Paul; Blueberryroad 85; 미국; 손전등, 가방; 2008 년 11 월 20 일, 4:39 PMHellen; BlueBerryroad 85; 미국; Lens13mm, 손전등, 가방, 외부, 2008 년 11 월 20 일, 16:41:32

나는 이것을 다음과 함께 나누고있다 :

list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);

내가 원하는 것은 $ name []가 "Paul"과 "Hellen"을 그 내용으로 포함시키는 것입니다. 다른 배열은 해당 열의 값을 수신합니다.

대신 나는 Paul만을 얻고 $ orderdate []의 내용은

2008 년 11 월 20 일, 4:39 PMHELLEN

따라서 모든 행이 연결되어 있습니다. 누군가 내가 필요한 것을 어떻게 달성 할 수 있는지 보여줄 수 있습니까?

편집 : 솔루션이 발견되었습니다.

이 코드를 사용하여 지금 해결했습니다.

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

어떤 이유로 든, 내 CSV 파일에는 2 개의 행만이 2 개의 행만 있고 2 개의 배열과 1 부울이 반환됩니다. 첫 번째 2는 내 데이터 배열이고 부울은 0입니다.

도움이 되었습니까?

해결책

당신은 사용하는 것이 좋습니다 fgetcsv () CSV 파일 구조를 알고 있으며 CSV 파일을 처리하기위한 지정된 옵션이 있습니다. 또는 사용할 수 있습니다 str_getcsv () 대신 파일의 내용에서.

다른 팁

그만큼 파일() 함수는 배열에서 파일을 읽고 모든 줄은 배열의 항목입니다.

그래서 당신은 다음과 같은 일을 할 수 있습니다.

$rows = array();
$name = array();
$street = array();
$country = array();

$rows = file("file.csv");
foreach($rows as $r) {
    $data = explode(";", $r);
    $name[] = $data[0];
    $street[] = $data[1];
    $country[] = $data[2];
}

이 코드를 사용하여 지금 해결했습니다.

$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
  $contents[] = fgetcsv($fo,0,';');
}
fclose($fo);

어떤 이유로 든, 내 CSV 파일에는 2 개의 행만이 2 개의 행만 있고 2 개의 배열과 1 부울이 반환됩니다. 첫 번째 2는 내 데이터 배열이고 부울은 0입니다.

fgetcsv에 대한 언급이 정확합니다.

교육 목적으로 여전히 귀하의 질문에 답할 것입니다. 첫째, 데이터 (COMAS 포함)와 "PHP의 문자열 읽기"의 차이점을 이해하지 못합니다 (일부 공간을 세미콜론으로 대체하지만 전부는 아닙니다). 추신 : 메시지의 소스 코드를 살펴 보았습니다. TSV (Tabs)와 CSV (COMA)의 홀수 혼합처럼 보입니다.

게다가, 이런 식으로 가고 싶다면 먼저 파일을 라인으로 분할 한 다음 필드의 선을 분할해야합니다.

가장 좋은 방법은 물론 FGETCSV ()가 지적한대로입니다.

$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
    $arr[] = $data;
fclose($f);

그러나 변수의 내용이 있고 분할하려면 str_getcsv를 사용할 수없는 경우 다음을 사용할 수 있습니다.

function str_split_csv($text, $seperator = ';') {
    $regex = '#' . preg_quote($seperator) . '|\v#';
    preg_match('|^.*$|m', $text, $firstline);
    $chunks = substr_count($firstline[0], $seperator) + 1;
    $split = array_chunk(preg_split($regex, $text), $chunks);
    $c = count($split) - 1;
    if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
        unset($split[$c]);
    return $split;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top