私のバッチジョブでこのコードを使用しています。
_<?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が正しいため、これがどのように可能であるかを理解できません。
誰かがいくつかの解決策で私を指摘できますか?
エラーが見つかりました:問題は、$ 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;
}
Drupal 6 Feeds モジュールは、カスタムモジュールよりもこのタスクに適している可能性があります。私はD7バージョンのみを使用しましたが、バッチ処理をサポートしていると思います まともなAPI があり、モジュールと統合できる可能性があるようです。
Flat File Checker などのツールを使用してCSVを確認し、問題がドキュメントの形式ではないことを確認することができます。