web-dev-qa-db-ja.com

バッチAPIでのcsvのインポートエラー

私のバッチジョブでこのコードを使用しています。

_<?php

function my_module_csv_import() {

  $folder = "csv";
  $files = scandir($folder);

  // define batch array structure
  // NOTE: minimal parameters defined to simplify code
  $batch = array(
    'title' => t('Reading File'),
    'operations' => array(
      array(
        '_my_module_batch_read', array($files_array),
        ),
        ),
        'finished' => '_my_module_batch_finished',
        );

        // set batch
        batch_set($batch);

        // process batch
        batch_process('');

        return '';

}


function _my_module_batch_read($files, &$context) {

  variable_set('site_offline', '1');

  // define batch limit
  $batch_limit = 500000;

  // assume the batch process has not completed
  $context['finished'] = 0;

  foreach($files as $csv_file_path) {

    // open the file for reading
    $file_handle = fopen($csv_file_path, 'r');

    if ($file_handle){
      // check if file pointer position exists in the sandbox, and jump to location in file
      if ($context['sandbox']['file_pointer_position']) {
        fseek($file_handle, $context['sandbox']['file_pointer_position']);
      }

      // loop through the file and stop at batch limit
      for ($i = 0; $i < $batch_limit; $i++) {

        // get file line as csv
        $csv_line = fgetcsv($file_handle);

        // NOTE: at this point, do what ever you'd like with the CSV array data!
        if (is_array($csv_line) && isset($csv_line[0]) && isset($csv_line[1])) {
          // DO STUFF
        } else {
          dpm("PROBLEM READING LINES");
        }

        // retain current file pointer position
        $context['sandbox']['file_pointer_position'] = ftell($file_handle);

        // check for EOF
        if (feof($file_handle)) {
          // complete the batch process
          $context['finished'] = 1;

          // end loop
          break;
        }
      }
    }
  }

  $context['finished'] = 1;

}
?>
_

正常に動作しますが、壊れることがあります。
$ csv_lineの結果、PROBLEM READING LINESが発生し、
warning: htmlspecialchars() [function.htmlspecialchars]: Invalid multibyte sequence in argument.
csvが正しいため、これがどのように可能であるかを理解できません。
誰かがいくつかの解決策で私を指摘できますか?

4
pasine

エラーが見つかりました:問題は、$ context ['sandbox'] ['file_pointer_position']をリセットしていないことです。
これにより、バッチポインターが誤った位置にあるCSVファイルの読み取りを開始します。
これを修正するには、追加するだけで十分です

$context['sandbox']['file_pointer_position'] = 0;

eOFのチェックへ

if (feof($file_handle)) {
    // complete the batch process
    $context['sandbox']['file_pointer_position'] = 0;
    $context['finished'] = 1;
    // end loop
    break;
}
2
pasine

Drupal 6 Feeds モジュールは、カスタムモジュールよりもこのタスクに適している可能性があります。私はD7バージョンのみを使用しましたが、バッチ処理をサポートしていると思います まともなAPI があり、モジュールと統合できる可能性があるようです。

Flat File Checker などのツールを使用してCSVを確認し、問題がドキュメントの形式ではないことを確認することができます。

1
Citricguy