【问题标题】:How to concatenate two columns in a csv file in php?如何在php中连接csv文件中的两列?
【发布时间】:2021-01-23 08:56:18
【问题描述】:

我有一个这样的 csv 文件:

我想连接这个 csv 文件中 style_color 列的值。例如 SCJEG4_1014。 我写了一个脚本,它使用标题“图片名称”创建最后一列,但在每个单元格中我只有“_”。

我该如何解决我的问题?

<?php

//uploaded xlsx file recovery
$xlsx="C:/wamp64/www/Extract_pictures_Excel/xlsx_files/".date('Y_m_d H-i-s')."_file.xlsx";
move_uploaded_file($_FILES["mon_fichier"]["tmp_name"],$xlsx);

// Excel in CSV
require_once 'PHPExcel/Classes/PHPExcel/IOFactory.php';
$excel = PHPExcel_IOFactory::load($xlsx);
$writer = PHPExcel_IOFactory::createWriter($excel, 'CSV');
$writer->setDelimiter(";");
$writer->setEnclosure("");
$nomcsv = "C:/wamp64/www/Extract_pictures_Excel/csv/".date('Ymd_His').".csv";
$writer->save($nomcsv);

$delimiter = ";"; 
$csv_data = array();
$row = 1;
if (($handle = fopen($nomcsv, 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
        $names_pictures = $data[7].'_'.$data[4];  
        $csv_data[] = $data;
        $row++;      
    }
    fclose($handle);
}

$extra_columns = array('Pictures Names' => $names_pictures);
foreach ($csv_data as $i => $data) {
    if ($i == 0) {
        $csv_data[$i] = array_merge($data, array_keys($extra_columns));
    } else {
        $csv_data[$i] = $data = array_merge($data, $extra_columns);
    }
}


if (($handle = fopen($nomcsv, 'w')) !== FALSE) {
    foreach ($csv_data as $data) {
        fputcsv($handle, $data, $delimiter);
    }
    fclose($handle);
}


?>

【问题讨论】:

    标签: php excel phpexcel fgetcsv fputcsv


    【解决方案1】:

    看起来您只添加了最后一行的详细信息(因为您只使用了一次 $names_pictures 的值)。在生成 $csv_data 数组时将此值添加到数据中会更好(恕我直言)...

    while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
        $data['Pictures Names'] = $data[7] . '_' . $data[4];  
        $csv_data[] = $data;
        $row++;      
    }
    

    然后您可以删除 foreach ($csv_data as $i =&gt; $data) { 循环

    如果您有不同的输出文件,您可以在上述循环之前打开输出文件并将数据直接写入输出文件,而不是使用$csv_data...

    if (($handle = fopen($nomcsv, 'r')) !== FALSE 
            && ($ohandle = fopen($nomcsvOutput, 'w')) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            $data['Pictures Names'] = $data[7] . '_' . $data[4];  
            fputcsv($ohandle, $data, $delimiter);  
        }
        fclose($handle);
        fclose($ohandle);
    }
    

    【讨论】:

    • 太好了,非常感谢您的解释并解决了我的问题。您是否知道我是否可以将此列放在“描述”列旁边而不是最后? @Nigel Ren
    • 您可以使用 array_splice() 将其添加到中间 - *.com/questions/3797239/… 应该提供更多的想法。
    • 我刚刚意识到一些事情。在我的文件中,我有图片名称,例如“SOJAD4_”,因为颜色单元格是空的。是否可以仅处理在我的 csv 文件中同时填充颜色和样式的值?
    • 比使用一些if 语句稍微复杂一些,但您可以使用($data[7] ?? '') . ((!empty($data[4])) ? "_" .$data[4] : '') 之类的语句
    • 试试(!empty($data[4]) ? ($data[7] ?? '') . "_" .$data[4] : '')