web-dev-qa-db-ja.com

すべてのユーザーをCSV形式でエクスポートするにはどうすればよいですか?

ビュー、Ctools、VBOがインストールされた8000人以上のユーザーがいるサイト。すべてのユーザーデータを1つのCSVファイルにエクスポートできますか?メモリを128MBに増やしても、 Views Data Export 運がないため(メモリ制限なし)疲れました。助けてください。

3
CocoSkin

以下をexpusers.moduleという名前のファイルに貼り付けます

<?php
/**
 *  Implementation of hook_menu()
 */
function expusers_menu() {
  $items['expusers'] = array(
    'page callback' => '_expusers_select',
    'access arguments' => array('administer expusers'),
  );
  return $items;
}

/**
 * Callback
 */
function _expusers_select() {
  // 
  $csvfile_name = 'expusers.csv'; // the file to save to
  $users = array();
  $result = db_query('SELECT * FROM {users}');
  foreach ($result as $record) {
    unset($userarray);
    foreach ($record as $key => $value) {
      $userarray[] = (empty($value)) ? '' : '"' . $value . '"';
    }
    $user = implode(',',$userarray);
    $users[] = $user . PHP_EOL; // Remove this if file_save_data don't work.
    // Use PHP statement below to append to file here if file_save_data don't work.
    // file_put_contents(..path to file.., $user, FILE_APPEND); 
  }
  $file = file_save_data($users,'public://' .$csvfile_name); // Remove this if file_save_data don't work.
  return '<p>CSV dump of {users} table written to file "' . $file->uri . '".</p>';
}

以下をexpusers.infoという名前のファイルに貼り付けます。

name = Export users
description = "Exports the {users} table to a CSV file in the public file area."
core = 7.x

expusersディレクトリ内にmodulesという名前のディレクトリを作成し、両方のファイルをその中に配置します。

サイトのモジュールページでカスタムモジュール「ユーザーのエクスポート」を有効にします。

パスexpusersに移動します(例:http://example.com/expusers)。

メッセージ:

CSV dump of {users} table written to file "public://expusers.csv".

表示されるはずです。

パブリックファイルエリアに移動し、ファイルを取得します。

上記の小さなカスタムモジュールは、リソースの消費量がViews data exportよりもはるかに少ないはずです。そのため、メモリの制限に達することなくCSVを取得できます。

ただし、ファイルにダンプする前に、最初にallユーザーデータをメモリ内の配列に収集します。

それでもメモリ制限に達した場合は、Drupalの非常に便利なfile_save_dataを使用してファイルに保存することはできません。代わりに、一度に1行ずつデータを保存する必要があります。これを行うための組み込みのDrupal関数はありませんが、代わりにPHP file_put_contentsを使用できるはずです。

コメントを使用して、コードを変更してDrupalのfile_save_dataをPHPのfile_put_contentsに置き換える方法を示しました。

4
Free Radical

これらの要件に対処するために考慮すべきもう1つのオプションは Forena モジュールです。

まず、レポート作成機能(WYSIWYGレポートライターやクエリビルダーなど)を使用して、ニーズに合ったレポートを作成します。その結果は、表形式の出力やグラフになります。レポートの内容が仕様に一致したら、それを(たとえば)CSVファイルとして保存できます。

以下は、forenaコミュニティのドキュメントページの1つ、つまり Forenaを検討する理由 からの引用です。

Forenaによって作成されたレポート(SVGGraphとmPDFを組み合わせたもの)は、PDFグラフが埋め込まれたドキュメントとして保存(エクスポート)できます。レポートの保存でサポートされている他の形式は、CSV、XLS、DOC、HTMLなどです。 。

Forena ビデオデモとチュートリアル には、ライブデモへのリンクがかなり含まれています。

0
Pierre.Vriens

これは単純な関数(D7)です。

/**
  * Export all active users into CSV.
  */
function foo_export_users_csv($filename = 'users-' . REQUEST_TIME) {
  drupal_add_http_header('Content-Type', 'text/csv');
  drupal_add_http_header('Content-Disposition', 'attachment; filename=' . $filename . '.csv');
  $results = db_query("SELECT * FROM {users} WHERE status = 1", array());
  $csvdata = 'Uid,Username,Email,Created,Access,Login' . PHP_EOL;
  foreach ($results as $record) {
    $row = array();
    $row[] = $record->uid; 
    $row[] = $record->name; 
    $row[] = $record->mail; 
    $row[] = $record->created; 
    $row[] = $record->access; 
    $row[] = $record->login; 
    $csvdata .= implode(',', $row) . PHP_EOL;
  }
  print $csvdata;
  drupal_exit();
} 

次に、hook_menu、いくつかの送信関数、または他の場所からこの関数を呼び出します。

/**
 * Some callback function.
 */
function foo_export_users_submit(&$form, &$form_state) {
  ini_set('max_execution_time', 0); // Set unlimited time for large sizes.
  $values = $form_state['values'];
  $op = $values['operation'];
  switch ($op) { 
    case 'export':
      foo_export_users_csv();
      break;
  } 
}
0
kenorb