PHP에서 CSV 파일을 배열로 변환

Olorunfemi Akinlua 2023년6월20일
  1. fopen()fgetcsv()를 사용하여 PHP에서 CSV를 배열로 변환
  2. str_getcsv()를 사용하여 PHP에서 CSV를 배열로 변환
  3. array_map()을 사용하여 PHP에서 CSV를 배열로 변환
PHP에서 CSV 파일을 배열로 변환

CSV(쉼표로 구분된 값) 파일은 데이터 파이프라인의 큰 부분입니다. 프로그래밍 언어에 관계없이 애플리케이션에는 CSV를 위한 공간이 있습니다.

CSV 파일은 데이터를 행 및 열 형식으로 저장하는 데 널리 사용됩니다. 따라서 배열은 PHP 애플리케이션 내에서 CSV 파일을 처리할 때 해당 값을 보관할 수 있는 완벽한 데이터 구조입니다.

이 기사에서는 CSV를 읽고 PHP에서 배열로 변환할 수 있는 내장 PHP 함수를 자세히 설명하고 보여줍니다.

fopen()fgetcsv()를 사용하여 PHP에서 CSV를 배열로 변환

이 섹션과 다른 두 섹션에서는 51개의 행과 4개의 열이 있는 상태 주택 값(state_housing_values.csv)을 포함하는 CSV 파일을 사용하여 이러한 기능이 어떻게 작동하는지 보여줍니다.

먼저 CSV 파일을 열고 fgetcsv() 함수를 첫 번째 인수로 지정하고 나머지 인수는 선택 사항으로 지정하려면 fopen() 함수가 필요합니다. 다른 매개변수에는 length, separator, enclosureescape가 포함됩니다.

이제 CSV 파일을 배열로 변환해 보겠습니다.

$file = fopen('state_housing_values.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

출력:

array(4) {
  [0]=>
  string(5) "State"
  [1]=>
  string(5) "Price"
  [2]=>
  string(13) "1-year change"
  [3]=>
  string(15) "1-year forecast"
}
array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
array(4) {
  [0]=>
  string(7) "Arizona"
  [1]=>
  string(7) "277,574"
  [2]=>
  string(3) "7.5"
  [3]=>
  string(4) "-0.5"
}
array(4) {
  [0]=>
  string(8) "Arkansas"
  [1]=>
  string(7) "130,907"
  [2]=>
  string(3) "3.8"
  [3]=>
  string(4) "-1.7"
}
array(4) {
  [0]=>
  string(10) "California"
  [1]=>
  string(7) "578,267"
  [2]=>
  string(3) "4.4"
  [3]=>
  string(4) "-1.1"
}
...

계속 진행하기 전에 PHP 코드베이스에 필요하지 않은 헤더를 제거할 수 있습니다. 이를 위해 while 루프 앞에 $line = fgetcsv($file)를 추가하기만 하면 됩니다.

$file = fopen('state_housing_values.csv', 'r');
$line = fgetcsv($file);
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

출력:

array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
...

이것으로 헤더는 더 이상 배열에 없습니다.

위의 배열 형식은 작업하기가 매우 어렵습니다. 배열을 더 잘 작동하게 하려면 코드를 리팩터링하고 array_combine()을 사용해야 합니다.

<?php

$filename = 'state_housing_values.csv';
$delimiter = ',';

if (file_exists($filename) || is_readable($filename)) {
    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            if (!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    var_dump($data);
} else {
    error_log("Error reading file.");
}
?>

출력:

array(50) {
  [0]=>
  array(4) {
    ["State"]=>
    string(7) "Alabama"
    ["Price"]=>
    string(7) "143,072"
    ["1-year change"]=>
    string(3) "5.5"
    ["1-year forecast"]=>
    string(4) "-1.1"
  }
  [1]=>
  array(4) {
    ["State"]=>
    string(6) "Alaska"
    ["Price"]=>
    string(7) "300,073"
    ["1-year change"]=>
    string(4) "-2.3"
    ["1-year forecast"]=>
    string(4) "-4.8"
  }
...

구분 기호가 쉼표 ,가 아닌 경우가 있습니다. 따라서 구분 기호를 지정해야 합니다.

다른 구분 기호는 세미콜론 ;, 공백 " " 또는 탭 \t일 수 있습니다. 함수 내에서 구분 기호를 지정하려면 아래 코드를 따를 수 있습니다.

$delimiter = ';'; // semi-colon
fgetcsv($handle, 1000, $delimiter)

str_getcsv()를 사용하여 PHP에서 CSV를 배열로 변환

여기에서 file() 함수를 사용하여 CSV를 처리하고 foreach 루프를 사용하여 파일 포인터를 반복하고 각 값을 str_getcsv()를 통해 $data 배열에 배치합니다. 기능.

$data = array();
$lines = file('state_housing_values.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $key => $value) {
    $data[$key] = str_getcsv($value);
}

print_r($data);

출력:

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )

    [2] => Array
        (
            [0] => Alaska
            [1] => 300,073
            [2] => -2.3
            [3] => -4.8
        )

    [3] => Array
        (
            [0] => Arizona
            [1] => 277,574
            [2] => 7.5
            [3] => -0.5
        )

    [4] => Array
        (
            [0] => Arkansas
            [1] => 130,907
            [2] => 3.8
            [3] => -1.7
        )

    [5] => Array
        (
            [0] => California
            [1] => 578,267
            [2] => 4.4
            [3] => -1.1
        )

    [6] => Array
        (
            [0] => Colorado
            [1] => 408,794
            [2] => 3.1
            [3] => -1.7
        )

    [7] => Array
        (
            [0] => Connecticut
            [1] => 259,855
            [2] => 1.4
            [3] => -2.3
        )

    [8] => Array
        (
            [0] => Delaware
            [1] => 257,521
            [2] => 0
            [3] => -2.9
        )

    [9] => Array
        (
            [0] => Florida
            [1] => 252,309
            [2] => 3.6
            [3] => -1.5
        )

    [10] => Array
        (
            [0] => Georgia
            [1] => 206,804
            [2] => 4.9
            [3] => -1.5
        )
...

위 코드에 몇 가지 변경 사항을 추가하여 헤더를 제거합니다. if 조건문을 사용하여 헤더를 포함하는 첫 번째 배열을 제거합니다.

foreach ($lines as $key => $value) {
    if (!$key == 0) {
        $data[$key] = str_getcsv($value);
    }
}

print_r($data);

출력:

Array
(
    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )
...

array_map()을 사용하여 PHP에서 CSV를 배열로 변환

위의 코드 스니펫은 루프 또는 전처리를 사용하여 CSV를 배열로 변환했습니다. 그러나 array_map()file() 기능을 사용하여 PHP 내에서 CSV 파일을 배열로 변환하는 더 좋고 빠르고 읽기 쉬운 방법이 있습니다.

$csv = array_map('str_getcsv', file('state_housing_values.csv'));
print_r($csv);

출력:

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

...

    [50] => Array
            (
                [0] => Wyoming
                [1] => 256,089
                [2] => 5.7
                [3] => -1.6
            )

)

이러한 함수는 값이 많은 CSV 파일을 처리할 수 있으며 이를 보여주기 위해 1857개 행과 17개 열에 걸쳐 레버리지 데이터를 보유하는 CSV 파일에서 array_map() 함수를 사용하고 헤더를 제거합니다. 배열의.

$csv = array_map('str_getcsv', file('leverage.csv'));
unset($csv[0]);
print_r($csv);

코드 출력(0.257초에 종료됨)은 다음과 같습니다.

Array
(
    [1] => Array
        (
            [0] => 001300
            [1] => 20150331
            [2] => 2015
            [3] => 1
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2015Q1
            [10] => 2015Q1
            [11] => 45357.0000
            [12] => 781.7070
            [13] => 5661.0000
            [14] => 15432.0000
            [15] => A
            [16] => 104.3100
        )

...
    [1856] => Array
        (
            [0] => 252940
            [1] => 20171231
            [2] => 2017
            [3] => 3
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2017Q4
            [10] => 2017Q3
            [11] =>
            [12] =>
            [13] =>
            [14] =>
            [15] => A
            [16] => 7.2700
        )

)

CSV 파일은 아래에서 코드와 함께 사용할 수 있습니다.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

관련 문장 - PHP CSV

관련 문장 - PHP Array