我有一个已上传的csv文件,我需要确定csv文件中有多少条目,并将第一列,中间列和最后一列格式化为带有$ header => $ value对的关联数组。我有代码将整个csv格式化为数组
function csv_to_array($filename='', $delimiter=',') {
if(!file_exists($filename) || !is_readable($filename)){
return FALSE;
}
$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);
}
return $data;
}
然而,我确定了如何确定这样做的方法。任何帮助,将不胜感激。我认为有一件事可能是使用上面的这个函数来获取数组,然后编写一些其他函数来获取此数组的开始中间和结尾并转储其余部分(但仍然需要知道如何执行它至于确定开头的中间和结尾
答案 0 :(得分:6)
当你在文件中阅读时我会处理这个。
// how many total columns
$total = count( $row );
// get the halfway point (and round up if a decimal)
$middle = ceil( $total/2 );
// Form a new row using the first (0), last ($total-1) and middle ($middle)
$new_row = array( $row[0], $row[ $middle ], $row[ $total-1 ] );
嵌入您的代码中:
function csv_to_array($filename='', $delimiter=',') {
if(!file_exists($filename) || !is_readable($filename)){
return FALSE;
}
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
$total = count( $row );
$middle = ceil( $total/2 );
$new_row = array( $row[0], $row[ $middle ], $row[ $total-1 ] );
if(!$header) {
$header = $new_row;
}else{
$data[] = array_combine($header, $new_row);
}
}
fclose($handle);
}
return $data;
}
通过假设整个文件中的每一行具有相同的列数,可以减轻一些处理能力。如果是这样,你只需计算一次,如下:
function csv_to_array($filename='', $delimiter=',') {
if(!file_exists($filename) || !is_readable($filename)){
return FALSE;
}
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
if ( !$total ){ // Verify if we have the total yet, and if not:
$total = count( $row );
$middle = ceil( $total/2 );
}
$new_row = array( $row[0], $row[ $middle ], $row[ $total-1 ] );
if(!$header) {
$header = $new_row;
}else{
$data[] = array_combine($header, $new_row);
}
}
fclose($handle);
}
return $data;
}