【问题标题】:Php reorder and add to csv filephp重新排序并添加到csv文件
【发布时间】:2015-03-08 02:26:52
【问题描述】:

我需要有一个脚本,我可以将 CSV 上传到该脚本,并让它以新顺序输出内容,删除一些字段并添加一些字段。我曾尝试将 csv 放入数组中,但电子邮件似乎破坏了它。输入可能如下所示:

col1, col2, col3, col4
name, addr, phon, emal
...

需要将输出更改为:

col4, col1, col3, col5
emal, name, addr, stat
...

注意 col3 消失了,而 col5 被添加了。 col5 是每一行的相同值。

我正在使用 foreach 循环执行此操作。哪个有效,但有点慢。我不知道是否有更好或更快的方法。

编辑:

答案似乎有效,但它提出了另外两个有用的功能:

第一,我有一个包含日期和时间的字段,例如1/31/15 23:59。有没有一种简单的方法可以去掉最后 6 个字符?

二,如果说col3有数据,我们可以跳过一行吗?我有一个退款日期列,如果其中有日期,我想跳过它。否则为空白。我知道我可以使用 isset,但如果col3 isset,我不知道如何让循环跳过并继续。另外我不知道如果没有数据,isset 是否仍然为 TRUE,因为该列仍然存在

【问题讨论】:

  • 没有代码很难提出建议。
  • 我之前的代码根本没用,也不是很好。我希望从比我更有经验的人那里得到一些原创的东西。

标签: php csv


【解决方案1】:
<?php
    $sInFile  = 'infile.csv';
    $sOutFile = 'outfile.csv';

    $iRow = 0;
    if( ( $rHandle = fopen( $sInFile, "r")) !== FALSE ) 
    {
        while( ( $aData = fgetcsv( $rHandle, 1000, ",") ) !== FALSE ) 
        {
            // Skip headers.
            if( $iRow != 0 )
            {
                $iCountColumns = count( $aData );
                for( $i = 0; $i < $iCountColumns; ++$i )
                {
                    // Source
                    // name, addr, phon, emal
                    $sTmp  = '';
                    $sTmp .= $aData[ 3 ];
                    $sTmp .= ', ';
                    $sTmp .= $aData[ 0 ];
                    $sTmp .= ', ';
                    $sTmp .= $aData[ 1 ];
                    $sTmp .= ', ';
                    $sTmp .= 'CONSTANT!'; 
                    $sTmp .= "\n"; 
                    // Output
                    // emal, name, addr, stat
                }
                file_put_contents( $sOutFile, $sTmp, FILE_APPEND | LOCK_EX );
            }
            ++$iRow;
        }
    }
?>

【讨论】:

  • 如果我将输入文件设置为$_FILES['file']['tmp_name']; 是否可以直接访问上传或者我需要将其保存到某个位置并触发此功能?
  • $_FILES['file']['tmp_name'];不会只给你一个文件位置的名字。您需要将文件从其临时上传位置移动到指定目录并从那里解析。
  • 好吧,好像没问题,也许你可以解决两个新问题。一,我有一个包含日期和时间的字段,例如1/31/15 23:59。有没有一种简单的方法可以去掉最后 6 个字符?二,如果说col3有数据,我们可以跳过一行吗?我有一个退款日期列,如果其中有日期,我想跳过它。否则为空白。我知道我可以使用isset,但我不知道如何让循环跳过并在 col3 isset 时继续。另外我不知道如果没有数据,isset 是否仍然为 TRUE,因为该列仍然存在。
  • 对数据使用explode,然后设置为日期的第一个数组键。 $aBadData = explode( ' ', $sBadDate ); $sFixedData = $aBadDate[ 0 ];或使用 substr( $sBadDate, -6 );要跳过 col3,只需执行 if( !empty( $aData[ 3 ] ) continue; 即可进入下一个循环。不惜一切代价避免 isset 并意识到 empty 确实为空和 isset 一起检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 2020-12-19
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多