PHP 및 fgetcsv 함수를 사용하여 CSV 파일에서 배열을 만드는 방법
누군가 fgetcsv를 사용하여 CSV 파일에서 배열을 만드는 코드를 친절하게 제공 할 수 있습니까?
다음 코드를 사용하여 간단한 CSV 파일에서 배열을 만들었지 만 내 필드 중 하나에 주소와 같은 쉼표가 여러 개 있으면 제대로 작동하지 않습니다.
$lines =file('CSV Address.csv');
foreach($lines as $data)
{
list($name[],$address[],$status[])
= explode(',',$data);
}
* 또한 str_getcsv는 내 호스팅 서비스에서 지원되지 않습니다.
위 코드는 다음 CSV 파일 예제에서 작동하지 않습니다. 첫 번째 열은 이름, 두 번째 열은 주소, 세 번째 열은 결혼 상태입니다.
Scott L. Aranda,"123 Main Street, Bethesda, Maryland 20816",Single
Todd D. Smith,"987 Elm Street, Alexandria, Virginia 22301",Single
Edward M. Grass,"123 Main Street, Bethesda, Maryland 20816",Married
Aaron G. Frantz,"987 Elm Street, Alexandria, Virginia 22301",Married
Ryan V. Turner,"123 Main Street, Bethesda, Maryland 20816",Single
제목에서 말했듯이 fgetcsv 는 갈 길입니다. 사용하기 매우 쉽습니다.
$file = fopen('myCSVFile.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
//$line is an array of the csv elements
print_r($line);
}
fclose($file);
fopen()
실패 할 경우 더 많은 오류 검사를 추가 하고 싶지만 이것은 CSV 파일을 한 줄씩 읽고 줄을 배열로 구문 분석하는 데 작동합니다.
str_getcsv () 구문이 훨씬 깔끔 하다고 생각하며 CSV를 파일 시스템에 저장할 필요도 없습니다.
$csv = str_getcsv(file_get_contents('myCSVFile.csv'));
echo '<pre>';
print_r($csv);
echo '</pre>';
또는 라인 별 솔루션의 경우 :
$csv = array();
$lines = file('myCSVFile.csv', FILE_IGNORE_NEW_LINES);
foreach ($lines as $key => $value)
{
$csv[$key] = str_getcsv($value);
}
echo '<pre>';
print_r($csv);
echo '</pre>';
또는 str_getcsv ()가없는 라인 별 솔루션의 경우 :
$csv = array();
$file = fopen('myCSVFile.csv', 'r');
while (($result = fgetcsv($file)) !== false)
{
$csv[] = $result;
}
fclose($file);
echo '<pre>';
print_r($csv);
echo '</pre>';
csv 문자열을 배열로 변환하는 함수를 만들었습니다. 이 함수는 특수 문자를 이스케이프하는 방법을 알고 있으며 엔클로저 문자를 사용하거나 사용하지 않고 작동합니다.
$dataArray = csvstring_to_array( file_get_contents('Address.csv'));
csv 샘플로 시도했는데 예상대로 작동합니다!
function csvstring_to_array($string, $separatorChar = ',', $enclosureChar = '"', $newlineChar = "\n") {
// @author: Klemen Nagode
$array = array();
$size = strlen($string);
$columnIndex = 0;
$rowIndex = 0;
$fieldValue="";
$isEnclosured = false;
for($i=0; $i<$size;$i++) {
$char = $string{$i};
$addChar = "";
if($isEnclosured) {
if($char==$enclosureChar) {
if($i+1<$size && $string{$i+1}==$enclosureChar){
// escaped char
$addChar=$char;
$i++; // dont check next char
}else{
$isEnclosured = false;
}
}else {
$addChar=$char;
}
}else {
if($char==$enclosureChar) {
$isEnclosured = true;
}else {
if($char==$separatorChar) {
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex++;
}elseif($char==$newlineChar) {
echo $char;
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex=0;
$rowIndex++;
}else {
$addChar=$char;
}
}
}
if($addChar!=""){
$fieldValue.=$addChar;
}
}
if($fieldValue) { // save last field
$array[$rowIndex][$columnIndex] = $fieldValue;
}
return $array;
}
오래된 질문이지만 여전히 PHP 5.2 사용자와 관련이 있습니다. str_getcsv는 PHP 5.3에서 사용할 수 있습니다. fgetcsv 자체와 함께 작동하는 작은 함수를 작성했습니다.
아래는 https://gist.github.com/4152628의 내 기능입니다 .
function parse_csv_file($csvfile) {
$csv = Array();
$rowcount = 0;
if (($handle = fopen($csvfile, "r")) !== FALSE) {
$max_line_length = defined('MAX_LINE_LENGTH') ? MAX_LINE_LENGTH : 10000;
$header = fgetcsv($handle, $max_line_length);
$header_colcount = count($header);
while (($row = fgetcsv($handle, $max_line_length)) !== FALSE) {
$row_colcount = count($row);
if ($row_colcount == $header_colcount) {
$entry = array_combine($header, $row);
$csv[] = $entry;
}
else {
error_log("csvreader: Invalid number of columns at line " . ($rowcount + 2) . " (row " . ($rowcount + 1) . "). Expected=$header_colcount Got=$row_colcount");
return null;
}
$rowcount++;
}
//echo "Totally $rowcount rows found\n";
fclose($handle);
}
else {
error_log("csvreader: Could not read CSV \"$csvfile\"");
return null;
}
return $csv;
}
보고
CSV 읽기 시작
Array
(
[0] => Array
(
[vid] =>
[agency] =>
[division] => Division
[country] =>
[station] => Duty Station
[unit] => Unit / Department
[grade] =>
[funding] => Fund Code
[number] => Country Office Position Number
[wnumber] => Wings Position Number
[title] => Position Title
[tor] => Tor Text
[tor_file] =>
[status] =>
[datetime] => Entry on Wings
[laction] =>
[supervisor] => Supervisor Index Number
[asupervisor] => Alternative Supervisor Index
[author] =>
[category] =>
[parent] => Reporting to Which Position Number
[vacant] => Status (Vacant / Filled)
[index] => Index Number
)
[1] => Array
(
[vid] =>
[agency] => WFP
[division] => KEN Kenya, The Republic Of
[country] =>
[station] => Nairobi
[unit] => Human Resources Officer P4
[grade] => P-4
[funding] => 5000001
[number] => 22018154
[wnumber] =>
[title] => Human Resources Officer P4
[tor] =>
[tor_file] =>
[status] =>
[datetime] =>
[laction] =>
[supervisor] =>
[asupervisor] =>
[author] =>
[category] => Professional
[parent] =>
[vacant] =>
[index] => xxxxx
)
)
$arrayFromCSV = array_map('str_getcsv', file('/path/to/file.csv'));
이 시도..
function getdata($csvFile){
$file_handle = fopen($csvFile, 'r');
while (!feof($file_handle) ) {
$line_of_text[] = fgetcsv($file_handle, 1024);
}
fclose($file_handle);
return $line_of_text;
}
// Set path to CSV file
$csvFile = 'test.csv';
$csv = getdata($csvFile);
echo '<pre>';
print_r($csv);
echo '</pre>';
Array
(
[0] => Array
(
[0] => Project
[1] => Date
[2] => User
[3] => Activity
[4] => Issue
[5] => Comment
[6] => Hours
)
[1] => Array
(
[0] => test
[1] => 04/30/2015
[2] => test
[3] => test
[4] => test
[5] =>
[6] => 6.00
));
올바른 키로 배열을 얻으려면 다음을 시도하십시오.
// Open file
$file = fopen($file_path, 'r');
// Headers
$headers = fgetcsv($file);
// Rows
$data = [];
while (($row = fgetcsv($file)) !== false)
{
$item = [];
foreach ($row as $key => $value)
$item[$headers[$key]] = $value ?: null;
$data[] = $item;
}
// Close file
fclose($file);
이 함수는 헤더 값이있는 배열을 배열 키로 반환합니다.
function csv_to_array($file_name) {
$data = $header = array();
$i = 0;
$file = fopen($file_name, 'r');
while (($line = fgetcsv($file)) !== FALSE) {
if( $i==0 ) {
$header = $line;
} else {
$data[] = $line;
}
$i++;
}
fclose($file);
foreach ($data as $key => $_value) {
$new_item = array();
foreach ($_value as $key => $value) {
$new_item[ $header[$key] ] =$value;
}
$_data[] = $new_item;
}
return $_data;
}
행 건너 뛰기 매개 변수로 향상된 @knagode의 함수에 대한 링크를 아래에서 확인하십시오. https://gist.github.com/gabrieljenik/47fc38ae47d99868d5b3#file-csv_to_array
<?php
/**
* Convert a CSV string into an array.
*
* @param $string
* @param $separatorChar
* @param $enclosureChar
* @param $newlineChar
* @param $skip_rows
* @return array
*/
public static function csvstring_to_array($string, $skip_rows = 0, $separatorChar = ';', $enclosureChar = '"', $newlineChar = "\n") {
// @author: Klemen Nagode
// @source: http://stackoverflow.com/questions/1269562/how-to-create-an-array-from-a-csv-file-using-php-and-the-fgetcsv-function
$array = array();
$size = strlen($string);
$columnIndex = 0;
$rowIndex = 0;
$fieldValue="";
$isEnclosured = false;
for($i=0; $i<$size;$i++) {
$char = $string{$i};
$addChar = "";
if($isEnclosured) {
if($char==$enclosureChar) {
if($i+1<$size && $string{$i+1}==$enclosureChar){
// escaped char
$addChar=$char;
$i++; // dont check next char
}else{
$isEnclosured = false;
}
}else {
$addChar=$char;
}
}else {
if($char==$enclosureChar) {
$isEnclosured = true;
}else {
if($char==$separatorChar) {
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex++;
}elseif($char==$newlineChar) {
echo $char;
$array[$rowIndex][$columnIndex] = $fieldValue;
$fieldValue="";
$columnIndex=0;
$rowIndex++;
}else {
$addChar=$char;
}
}
}
if($addChar!=""){
$fieldValue.=$addChar;
}
}
if($fieldValue) { // save last field
$array[$rowIndex][$columnIndex] = $fieldValue;
}
/**
* Skip rows.
* Returning empty array if being told to skip all rows in the array.
*/
if ($skip_rows > 0) {
if (count($array) == $skip_rows)
$array = array();
elseif (count($array) > $skip_rows)
$array = array_slice($array, $skip_rows);
}
return $array;
}
이 아주 기본적인 코드를 생각해 냈습니다. 누구에게나 유용 할 수 있다고 생각합니다.
$link = "link to the CSV here"
$fp = fopen($link, 'r');
while(($line = fgetcsv($fp)) !== FALSE) {
foreach($line as $key => $value) {
echo $key . " - " . $value . "<br>";
}
}
fclose($fp);
이 코드를 시도하십시오.
function readCsv($file)
{
if (($handle = fopen($file, 'r')) !== FALSE) {
while (($lineArray = fgetcsv($handle, 4000)) !== FALSE) {
print_r(lineArray);
}
fclose($handle);
}
}
각 라인이 배열에 있고 라인의 각 셀이 배열에 있도록하려면 :
$file = fopen('csvFile.csv', 'r'); // Open the file
while (($line = fgetcsv($file)) !== FALSE) { // Read one line
$array[] =$line; // Add the line in the main array
}
echo '<pre>';
print_r($array); //print it out
echo '</pre>';
fclose($file);
'developer tip' 카테고리의 다른 글
라 라벨 스타일 시트와 자바 스크립트가 기본 경로가 아닌 경우로드되지 않습니다. (0) | 2020.09.02 |
---|---|
Visual Studio의 빌드를 매우 장황하게 만들려면 어떻게해야합니까? (0) | 2020.09.02 |
Postgres 9.3에서 json 필드에 인덱스를 만드는 방법 (0) | 2020.09.01 |
React.js : contentEditable에 대한 onChange 이벤트 (0) | 2020.09.01 |
pySerial 패키지 사용의 전체 예제 (0) | 2020.09.01 |