0

昨日の売り上げ(Magento)をカスタムphpscriptで毎日エクスポートしています。

ダイレクトバンキングを取得したので、コードを少し変更する必要がありました。CC_Type(Visa、JBC、...)に値「direct」を設定して、分析用の見栄えの良いデータを取得するというアイデアでした。

csvは実際にはきれいに見え、Excelまたはmssqlを使用して手動でインポート(インポートをカスタマイズする場合)すると、希望どおりに機能します。しかし、私がそれを自分で開くと(私たちのシステムが夜にデータをインポートするように)、奇妙なことが起こります。

開いているドキュメントでExcelのスクリーンショット

  • data- / functionbar(fx)で、curserがDにあることがわかります。さらに文字を挿入すると、オンラインショップの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のスクリーンショットです Notepad++で開いたCSVのスクリーンショット

4

2 に答える 2

2

ファイルの解像度を からCSVに変更しTXT、 を使用し、区切り文字として文字をImport file指定します。これで問題ありません!TAB

于 2013-02-13T11:10:58.963 に答える
1

これはC SV ではなく、タブ区切りの値ファイルであるT SVです。 Excel は、ユーザーが指示してデータを誤って解釈しない限り、それを認識しません。

于 2013-02-13T11:06:41.917 に答える