누군가 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;
}
답변
$arrayFromCSV = array_map('str_getcsv', file('/path/to/file.csv'));
답변
오래된 질문이지만 여전히 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
)
)
답변
이 시도..
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
));
답변
이 함수는 헤더 값이있는 배열을 배열 키로 반환합니다.
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;
}