【问题标题】:Ignore columns in CSV with PHP使用 PHP 忽略 CSV 中的列
【发布时间】:2019-03-08 15:36:00
【问题描述】:

我只想从我的 csv 中提取几列而忽略其余列 这是包含所有列的 csv

part_number_key,buy_button_rank,category_id,id,brand,vendor_category_id,name,part_number,sale_price,currency,description,url,warranty,general_stock,weight,status,recommended_price,images,characteristics,attachments,vat_id,family,start_date,estimated_stock,reversible_vat_charging,min_sale_price,max_sale_price,offer_details,offer_properties,product_measurements,availability,stock,handling_time,barcode,ean,commission,validation_status,offer_validation_status,ownership,best_offer_sale_price,best_offer_recommended_price,number_of_offers
    DASDSA,1,11,123,brand,,Name,"part number",12.31,RON,description,https://www.url.com,12,10,0,1,12.19,"a:3:{i:0;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg1"";s:12:""display_type"";i:1;}i:1;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg2"";s:12:""display_type"";i:0;}i:2;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg3"";s:12:""display_type"";i:0;}}","a:11:{i:0;a:2:{s:2:""id"";i:8937;s:5:""value"";s:5:""value"";}i:1;a:2:{s:2:""id"";i:8930;s:5:""value"";s:5:""value"";}i:2;a:2:{s:2:""id"";i:8927;s:5:""value"";s:5:""value"";}i:3;a:2:{s:2:""id"";i:8928;s:5:""value"";s:5:""value"";}i:4;a:2:{s:2:""id"";i:5537;s:5:""value"";s:5:""value"";}i:5;a:2:{s:2:""id"";i:8932;s:5:""value"";s:5:""value"";}i:6;a:2:{s:2:""id"";i:8934;s:5:""value"";s:5:""value"";}i:7;a:2:{s:2:""id"";i:8929;s:5:""value"";s:5:""value"";}i:8;a:2:{s:2:""id"";i:7235;s:5:""value"";s:5:""value"";}i:9;a:2:{s:2:""id"";i:6556;s:5:""value"";s:5:""value"";}i:10;a:2:{s:2:""id"";i:5401;s:5:""value"";s:5:""value"";}}",a:0:{},1,"a:3:{s:2:""id"";i:1104;s:4:""name"";s:4:""NAME"";s:14:""family_type_id"";i:244;}",a:0:{},10,,11,200,"a:3:{s:2:""id"";i:2484194;s:13:""warranty_type"";N;s:16:""supply_lead_time"";i:14;}",a:0:{},a:0:{},"a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:2:""id"";i:3;}}","a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:5:""value"";i:10;}}","a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:5:""value"";i:0;}}",a:0:{},a:0:{},"a:5:{s:5:""value"";s:7:""20.0000"";s:4:""type"";s:10:""percentage"";s:2:""id"";s:3:""123"";s:8:""priority"";s:1:""4"";s:7:""created"";s:19:""2010-01-16 11:25:02"";}","a:1:{i:0;a:3:{s:5:""value"";i:9;s:11:""description"";s:22:""Approved documentation"";s:6:""errors"";N;}}","a:3:{s:5:""value"";i:1;s:11:""description"";s:8:""Saleable"";s:6:""errors"";N;}",1,11,11,1
    D3129DKQW,1,456,123,Bluedio,,name,"part number",123,EUR,description,https://url.com,24,1,0,1,12,"a:3:{i:0;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg1"";s:12:""display_type"";i:1;}i:1;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg2"";s:12:""display_type"";i:0;}i:2;a:2:{s:3:""url"";s:27:""https://url.com/images.jpg3"";s:12:""display_type"";i:0;}}","a:14:{i:0;a:2:{s:2:""id"";i:7774;s:5:""value"";s:3:""val"";}i:1;a:2:{s:2:""id"";i:7947;s:5:""value"";s:3:""val"";}i:2;a:2:{s:2:""id"";i:8001;s:5:""value"";s:3:""val"";}i:3;a:2:{s:2:""id"";i:8937;s:5:""value"";s:3:""val"";}i:4;a:2:{s:2:""id"";i:8930;s:5:""value"";s:3:""val"";}i:5;a:2:{s:2:""id"";i:8927;s:5:""value"";s:3:""val"";}i:6;a:2:{s:2:""id"";i:8928;s:5:""value"";s:3:""val"";}i:7;a:2:{s:2:""id"";i:5537;s:5:""value"";s:3:""val"";}i:8;a:2:{s:2:""id"";i:8932;s:5:""value"";s:3:""val"";}i:9;a:2:{s:2:""id"";i:8934;s:5:""value"";s:3:""val"";}i:10;a:2:{s:2:""id"";i:8929;s:5:""value"";s:3:""val"";}i:11;a:2:{s:2:""id"";i:7235;s:5:""value"";s:3:""val"";}i:12;a:2:{s:2:""id"";i:6556;s:5:""value"";s:3:""val"";}i:13;a:2:{s:2:""id"";i:5401;s:5:""value"";s:3:""val"";}}",a:0:{},1,"a:3:{s:2:""id"";i:123456;s:4:""name"";s:4:""Name"";s:14:""family_type_id"";i:244;}",a:0:{},144,,11,200,"a:3:{s:2:""id"";i:242414;s:13:""warranty_type"";N;s:16:""supply_lead_time"";i:14;}",a:0:{},a:0:{},"a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:2:""id"";i:3;}}","a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:5:""value"";i:9;}}","a:1:{i:0;a:2:{s:12:""warehouse_id"";i:1;s:5:""value"";i:0;}}",a:0:{},a:0:{},"a:5:{s:5:""value"";s:7:""20.0000"";s:4:""type"";s:10:""percentage"";s:2:""id"";s:5:""12492"";s:8:""priority"";s:1:""4"";s:7:""created"";s:19:""2010-01-16 11:25:02"";}","a:1:{i:0;a:3:{s:5:""value"";i:9;s:11:""description"";s:22:""Approved documentation"";s:6:""errors"";N;}}","a:3:{s:5:""value"";i:1;s:11:""description"";s:8:""Saleable"";s:6:""errors"";N;}",1,77.31,83.19,1

这是php代码

$handle = fopen("feed.csv", "r");

$columns = array(11, 7, 11, 9, 14, 5, 3, 18);
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        echo("<tr>\r\n");
        foreach ($data as $index=>$val) {
                if (in_array($index+1, $columns)) {
                        echo("\t<td>$val</td>\r\n");
                }

        }
        echo("</tr>\r\n");
}

问题在于输出,输出没有逗号(分隔符)或换行符,这不是有效的 CSV,我如何用 fputcsv() 重写 csv;在这种情况下?

谢谢!

【问题讨论】:

  • 使用fputcsv 并在构建中定义您的索引。 fputcsv($handler, array($data[11], $data[7], $data[11], $data[9], $data[14], $data[5], $data[3], $data[18]))

标签: php csv fgetcsv fputcsv


【解决方案1】:

设置快速简单:

<?php
$csv = array_map('str_getcsv', file("feed.csv")); // Loads CSV into memory as an array.

// Convert to a key => value Array.
array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
});

array_shift($csv); // Removes column headers.

// Removes unwanted Columns.
$csv = array_map(function($a){
    unset($a["id"]);
    unset($a["commission"]);
    return $a;
}, $csv);

print_r($csv);

将 array_map 更改为此表输出。

echo "<table>";
array_map(function($a){
    unset($a["id"]);
    unset($a["commission"]);
    echo "<tr>";
    foreach($a as $key => $value) {
        echo "<td>{$value}</td>";
    }
    echo "</tr>";
}, $csv);
echo "</table>";

【讨论】:

    【解决方案2】:

    这就是我使用关联键的方式。

    $headers = fgetcsv($handle, 1000, ",");
    //[part_number_key,buy_button_rank,category_id, ...]
    
    $header_len = count($headers);
    
    $keep = array_flip(['part_number_key']); //<-- keep items in this array
    
    $i=0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
          ++$i;
          if(count($data) != $header_len) die('Delimiter miss match on line '.$i);
         //[DASDSA,1,11, ...]
    
         $row = array_combine($headers, $data);
         //[part_number_key=>DASDSA,buy_button_rank=>1,category_id=>11, ...]
    
         $row = array_intersect_key($row, $keep); //or array_diff_key for the opposite
        //[part_number_key=>DASDSA]
    }
    

    只要您的列和标题匹配,这将起作用。

    更新

    由于这条评论,我在上面的代码中添加了列计数检查:

    警告:array_combine():两个参数应该有相同数量的元素

    如何处理错误取决于您,如果您在列中缺少分隔符或重复标题,这很典型。键是唯一的,因此标题名称应该是唯一的。

    你可以这样做:

      print_r(array_count_values($header));
    

    【讨论】:

    • 感谢您的帮助,我收到了这些警告Warning: array_combine(): Both parameters should have an equal number of elements in test.php on line 30 Warning: array_intersect_key(): Argument #1 is not an array in test.php on line 32 Warning: array_combine(): Both parameters should have an equal number of elements in test.php on line 30 Warning: array_intersect_key(): Argument #1 is not an array in test.php on line 32 Line 30: $row = array_combine($headers, $data); Line 32: $row = array_intersect_key($row, $keep);
    • 您的 CSV 文件可能缺少一列或多出一列。这不是一个容易解决的问题,因为哪一列是多余的或缺少的,这不是您可以通过编程方式真正决定的。这就是我这么说的原因This will work so long as your columns and headers match.
    • 如何处理由你决定,如果你控制了文件的来源,你可能想看看它是如何制作的,如果没有,你可以做if(count($headers) != count($data)),然后做相应的事情。报告该行,您可以使用简单的$i=1(标题的偏移量)计算行数,然后在末尾的循环中++$i,然后您可以看到哪一行并检查文件中发生了什么。当然你也可以print_r那一行,但我发现在大多数情况下查看文件是一个更好的选择。
    • 所以也许最好在我通过 JSON 创建 csv 之前删除不需要的列,我通过 API 获取数据,所以当我从 API 收到数据时我会尝试修改数据......但我不能这样做,因为响应有数组......
    • 你可以使用 array_intersect_keyarray_diff_keyphp.net/manual/en/function.array-intersect-key.php array_intersect_key() returns an array containing all the entries of array1 which have keys that are present in all the arguments 所以如果你有一个标题数组,你可以使用它来映射你的数据,如果他们有键是相同的。您也可以使用array_merge(array_fill_keys($header, ''), $data) 添加缺失的字段等。
    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2019-09-27
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多