首页 > 解决方案 > 用于重新排列 csv 数据并输出为 csv 的 PHP 脚本

问题描述

我在 csv 文件中有以下数据。 在此处输入图像描述

我需要重新排列数据并将其连接成 2 列。列将是 SKU 和 Feature。其中 SKU = SKU 和 Feature 将衍生自以下格式的其他列。

对于黄色标记的行:特征列数据将是:Edge:Square Edge;Wide Plank|Finish:Glossy;Smooth|Grade:A(Select & Better/Prestige)|Installation Location:Second Floor;Main Floor........

我可以解析 csv 并卡住。

$lines = explode( "\n", file_get_contents( '3b.csv' ) );
$headers = str_getcsv( array_shift( $lines ) );
$data = array();
foreach ( $lines as $line ) {

    $row = array();

    foreach ( str_getcsv( $line ) as $key => $field )
       if($headers[$key]=='sku'){
        $row[ $headers[ $key ] ] = str_replace(",",";",$field);
        }
        if($headers[$key]!='sku' && $field!='') {
            $row['feature'] =  $headers[ $key ].":".str_replace(",",";",$field)."|";


        }

    $row = array_filter( $row );

    $data[] = $row;

}
echo "<pre>";
print_r($data);
echo "</pre>";

任何人请帮我这样做或建议任何脚本来做到这一点。

标签: phpcsv

解决方案


您尚未提供传入 csv 文件的实际文本,因此我假设正常解析它会正常工作。

我从你接下来的两个问题中借用了我的脚本来无条件地处理你的数据。

标题行的数据用作特征名称的查找数组。

代码:(未经测试)

$file = fopen("3b.csv", "r");
$headers = fgetcsv($file);
$final_array = [];
while (($row = fgetcsv($file)) !== false) {
    $sku = $row[0];
    unset($row[0]);
    foreach ($row as $featureNameIndex => $featureValues) {
        foreach (explode(',', $featureValues) as $featureValue) {
            $final_array[] = [
                'sku' => $sku,
                'feature' => "{$headers[$featureNameIndex]}:{$featureValue}"
            ];
        }
    }
}
fclose($file);

var_export($final_array);

这种方法将生成一个关联数组的索引数组——每个数组包含两个元素。

具有多个值的特征被划分并存储为单独的子数组。


推荐阅读