【问题标题】:php exports to cvs, but something happens that makes the csv totally unusablephp 导出到 csv,但发生的事情使 csv 完全无法使用
【发布时间】:2013-02-13 10:52:49
【问题描述】:

我每天都通过自定义 phpscript 导出昨天 (Magento) 的销售额。

自从我们获得了直接银行业务后,我不得不稍微更改一下代码。 我们的想法是在 CC_Type(Visa,JBC,...) 中设置“直接”值,以便我们有漂亮的数据用于我们的分析。

csv 看起来实际上很干净,当我使用 excel 或 mssql 手动导入(您自定义导入的位置)时,它会按预期工作。但是当我让它自己打开时(就像我们的系统会在晚上导入数据一样)奇怪的事情发生了。

  • 在数据/功能栏 (fx) 中,您可以看到光标位于 D 上,如果我插入更多字母,它们会在 onlineshop 的 p 之后附加。
  • 标题(第一行) 和后面的每个数据行都会在没有 "" 的情况下导入,我知道 excel 有时会这样做,但在此文档之前从未这样做过. 好吧,那是一个谎言,我从不承认,因为它确实有效。

//

class Mage_Shell_Compiler extends Mage_Shell_Abstract {
const OUTPUT = false;
const DEL = "\t";
const BR = "\r\n";
const FILEPATH = '../var/export/';
const FILENAME = 'tdtaCash';

protected $_orders = array();
protected $_csv_output = '';
protected $_headers = array(
    "dtTag" => false, // Bestelldatum
    "fiCBox" => 94,
    "fiCashier" => "onlineshop",
    "fiCurrency" => array('Visa', 'MC', 'Amex', 'DC', 'JCB', 'Direct'), // Zahlungsart
    "dtRev" => false  // Bruttoumsatz an diesem Tag mit dieser Zahlungsart
);

/// @see $_headers for details
protected function addOrderToRows($order, $rows) {
    $order_data = $order->getOrigData();
    $type = $order->getPayment()->getAdditionalInformation('CC_BRAND');

    switch ($type) {
        case 'VISA':
            $type = 'Visa';
            break;
        case 'MasterCard':
            $type = 'MC';
            break;
        case 'American Express':
            $type = 'Amex';
            break;
        case 'Diners Club':
            $type = 'DC';
            break;
        case 'JCB':
            $type = 'JCB';
            break;
        default:
            $brand = $order->getPayment()->getAdditionalInformation('BRAND');
            if ($brand == 'DirectEbankingAT') {
                $type = 'Direct';
            }
            break;
    }

    if (empty($rows[$type])) {
        $row = $this->_headers;
        $row["dtRev"] = 0;
    } else
        $row = $rows[$type];

    //$row['dtTag']       = date('Y-m-d', strtotime($order_data['created_at']));
    $row['dtTag'] = $this->formatDate($order_data['created_at'], 'exportdate', true);
    $row["fiCurrency"] = $type;
    $row["dtRev"] += $order_data['grand_total'];

    $rows[$type] = $row;

    return $rows;
}

protected function __($msg) {
    if (self::OUTPUT)
        print $msg . "\n";
}

/**
 * Get Orders instance
 *
 * @return Mage_Sales_Model_Order
 */
protected function _getOrders($day = 1) {
    $timeZoneOffset = Mage::getModel('core/date')->getGmtOffset();
    $yesterday = date('Y-m-d', strtotime("-$day day")) . ' 00:00:00';
    $yesterday = date('Y-m-d H:i:s', strtotime($yesterday) - $timeZoneOffset);
    $day--;
    $today = date('Y-m-d', strtotime("-$day day")) . ' 00:00:00';
    $today = date('Y-m-d H:i:s', strtotime($today) - $timeZoneOffset);
    if (!$this->_orders)
        $this->_orders = Mage::getResourceModel('sales/order_collection')
                ->addAttributeToSelect('*')
                /// @note uncommented to remove daily filter
                ->addAttributeToFilter('created_at', array("from" => $yesterday, "to" => $today))
                ->addAttributeToFilter('status', array('nin' => array('holded', 'canceled', 'pending_payment', 'pending')));
    return $this->_orders;
}

protected function addRowToOutput($row) {
    if (isset($row["dtRev"]))
        $row["dtRev"] = number_format($row["dtRev"], 2);
    $this->_csv_output .= '"' . implode('"' . self::DEL . '"', $row) . '"' . self::BR;
}

protected function addCsvHeader() {
    $this->addRowToOutput(array_keys($this->_headers));
}

/**
 * Run script
 *
 */
public function run() {
    if ($this->getArg('export')) {
        $day = is_numeric($this->getArg('day')) ? $this->getArg('day') : 1;
        $file = self::FILEPATH . self::FILENAME . '.csv';
        $this->__('orders to export ' . count($this->_getOrders($day)));
        // add header if file is empty
        if (!strlen(trim(file_get_contents(dirname(__FILE__) . '/' . $file))))
            $this->addCsvHeader();
        $rows = array();
        foreach ($this->_getOrders($day) as $order)
            $rows = $this->addOrderToRows($order, $rows);
        while ($row = array_shift($rows))
            $this->addRowToOutput($row);
        file_put_contents(dirname(__FILE__) . '/' . $file, $this->_csv_output, FILE_APPEND);
        $this->__($this->_csv_output);
    } else {
        echo $this->usageHelp();
    }
}

/**
 * Retrieve Usage Help Message
 *
 */
public function usageHelp() {
    return <<<USAGE
    Usage:  php -f export_tdtaCash.php -- [options]
    export  ...  Appends data to file tdtaCash.csv in Directory var/export/
    day     ...  days to count back
    help    ...  This help
USAGE;
    }

}

$shell = new Mage_Shell_Compiler();
$shell->run();

所以我的问题是,有人可以解释一下什么样的来源对这种效果负责,我可以做些什么来预防不再得到这样的结果?!

编辑: 这是在 Notepad++ 中打开的 CSV 的屏幕截图

【问题讨论】:

  • 实际的 CSV 是什么样的文本数据?让我们完全忘记 Excel 是如何解释这些数据的,因为 Excel 确实不是判断任何数据的最佳产品。
  • 在记事本++中看起来完全正常...

标签: php excel zend-framework csv magento-1.4


【解决方案1】:

将文件分辨率从CSV 更改为TXT 并使用Import file,指定TAB 字符作为分隔符 - 你会没事的!

【讨论】:

  • 如果您还是手动导入文件,则无需更改扩展名。
  • @deceze 对于我的 Excel 2007,它只是在 OP 屏幕上打开 CSV。
【解决方案2】:

这不是 C SV,它是 T SV,标签 分隔值文件。
Excel 不会知道这一点,除非你告诉它并曲解数据。

【讨论】:

  • sry 我曾经上传过旧版本,其中 SU 没有被 Direct 取代。这是现在的实际形式。我的 mssql 曾经从这个文件中导入,它看起来/感觉就像 excel 使用的一样。所以我选择excel来展示。但关键是,我们从那时起就这样做了,而且效果很好.. 嗯,也许是时候改变了..
  • 仍然,CSV!== TSV。 Excel 将 TSV 解释为 CSV,仅此而已。
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多