0

我有一个具有以下结构的csv: 在此处输入图像描述

我需要输出csv如下:

在此处输入图像描述

这意味着从每一列中提取特征并将其放在单行中。

我正在使用 php office 来获取和写入 csv。我写了以下内容:

if ( false === $handle = fopen('../../../3b.csv', 'r') )
    throw new Exception('File open failed.');  
$headers = fgetcsv($handle);
$row =  '';
$row = array();
$data = '';
$data = array();
while ( false !== $fields = fgetcsv($handle) ) {
    $fields = array_combine($headers, $fields);
        foreach($fields as $key=>$value){
            if($key!='sku'){
                if($value==''){
                    continue;
                }
            }
            $row[$key] = $value;
}
if(sizeof($row)==1){
    unset($row['sku']);
}
    $row = array_filter( $row );
    $data[] = $row;    
}
$data = array_filter($data);
$use_keys = ['sku','AC Rating','color','Feature','Finish','Grade','Installation Location','Installation Method','Plank Style','Size','Specie','Tile Format','Warranty','Wear Layer','Width','LifeStyle',
'Material','Style','Thickness','Appearance','PEIRating','ProtectionRating'];  
foreach($data as $key=>$value){   
    $new_arr = [];
    foreach($use_keys as $apk_item) {  
        $new_value = '';
        if (isset($data[$key][$apk_item])) {
            $new_value = str_replace(",","|",$data[$key][$apk_item]);
        }            
        $new_arr[$apk_item] = $new_value;                
    } 
    $data[$key] = $new_arr;
}
$data = array_filter($data, 'array_filter');
$final_array = array();
foreach ($data as $features) {
    $product = array('feature' => '');
    foreach ($features as $key => $feature) {
        if ($key == 'sku') {
            $product['sku'] = $feature;
        }
        else {

            if($feature!=''){
            $product['feature'] .= $key;
            $product['value'] .= $feature;

            }
        }
    }
   
    $final_array[] = $product;
}
$final_array = array_filter($final_array);  
$table  = '<table border="1" id="csvtable">
<thead><tr><th>sku</th><th>feature</th><th>value</th></tr></thead>
<tbody>';   
foreach($final_array as $value){
    $sku = $value["sku"];
    $combinedfeature = explode(",", $value['feature']);   
            foreach($combinedfeature as $single){   
                $table .=   '<tr><td width="20%">'.$sku.'</td><td width="40%">'.$single['feature'].'</td><td width="40%">'.$single['value'].'</td></tr>';  
            }       
    
 }
 $table .= '</tbody></table>';   
print_r($table);

它给出了错误的输出。我怎样才能做到这一点?任何人都可以帮忙,好吗?

4

1 回答 1

1

一种更紧凑的方法是在一个循环中读取输入并写出目标文件。

此代码读取每一行,将其与标题组合,然后提取 sku(并将其从详细信息中删除)。然后循环剩余的细节,如果有要输出的值,它将输出写入结果文件。

由于每个值也可能是逗号分隔的列表,这用于explode()将它们拆分为单独的项目并将它们作为单独的部分写出来......

$inputFile = "a.csv";
$outputFile = "a1.csv";
$inputHandle = fopen($inputFile, 'r');
$outputHandle = fopen($outputFile, 'w');
$headers = fgetcsv($inputHandle);
fputcsv($outputHandle, ["sku", "feature", "value" ]);

while ( false !== $fields = fgetcsv($inputHandle) ) {
    $fields = array_combine($headers, $fields);
    $sku = $fields['sku'];
    unset($fields['sku']);
    foreach ( $fields as $name => $field )  {
        if (!empty(trim($field)))   {
            $subFields = explode(",", $field );
            foreach ( $subFields as $value )    {
                fputcsv($outputHandle, [$sku, $name, $value]);
            }
        }
    }
}
fclose($inputHandle);
fclose($outputHandle);
于 2020-09-24T14:40:52.633 回答