StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

researchmapに一括登録するためのcsvをエクセルから生成するツール

以前、researchmapに一括登録するためのcsvをエクセルからの変換で生成する方法についてのエントリ(リンク)を書いてましたが、Pythonのスクリプトとシェルスクリプトに分かれていたり、スクリプトを置く場所を気をつけないといけなかったり、Windowsの人とツールが共有できるか謎だったりしたので、ブラウザで動かせるようにJavascriptにしました。
ごく簡単な内容で、ポイントとしては、

  • CSVの1行目はデータではなく識別コードを記載する(下記コードのfilePrefixの部分)
  • すべてのデータを""で囲む
  • アブストラクトのコピーも登録する場合、セル内で改行が発生する場合があるので、念のため改行コードをそろえるようにしておく

程度ですね。
1つのエクセルファイルに「rm_published_papers」(論文)や「 rm_presentations」(口頭発表)などのシートを設けておいて、それを全部読み込んで個別にCSV化(すべてのCSVを1つのzipファイルにまとめて出力)するという内容です。
 

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>researchmap CSV 変換ツール</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.2/papaparse.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
  <style>
    body { font-family: sans-serif; padding: 2em; }
    h1 { font-size: 1.5em; margin-bottom: 1em; }
    input, button { margin-top: 1em; display: block; }
  </style>
</head>
<body>
  <h1>researchmap CSV 変換ツール</h1>
  <input type="file" id="excelFile" accept=".xlsx" />
  <button onclick="handleConvert()">CSVへ変換(ZIP出力)</button>
  <p id="status"></p>

  <script>
    const sheetConfig = {
      rm_published_papers: "published_papers",
      rm_presentations: "presentations",
      rm_books_etc: "books_etc",
      rm_research_projects: "research_projects",
      rm_teaching_experience: "teaching_experience",
      rm_media_coverage: "media_coverage",
      rm_industrial_property_rights: "industrial_property_rights",
      rm_awards: "awards",
      rm_committee_memberships: "committee_memberships",
      rm_misc: "misc"
    };

    function handleConvert() {
      const fileInput = document.getElementById('excelFile');
      const status = document.getElementById('status');
      const file = fileInput.files[0];
      if (!file) return;

      const reader = new FileReader();
      reader.onload = async (e) => {
        const data = new Uint8Array(e.target.result);
        const workbook = XLSX.read(data, { type: "array" });
        const zip = new JSZip();

        Object.entries(sheetConfig).forEach(([sheetName, filePrefix]) => {
          const sheet = workbook.Sheets[sheetName];
          if (sheet) {
            const json = XLSX.utils.sheet_to_json(sheet, { defval: "", raw: false });
            let csv = Papa.unparse(json, { quotes: true });
            csv = csv.replace(/\r?\n/g, "\r\n"); // 改行コードをCRLFに統一
            const content = `${filePrefix}\r\n${csv}`;
            zip.file(`${filePrefix}.csv`, content);
          }
        });

        const blob = await zip.generateAsync({ type: "blob" });
        saveAs(blob, "researchmap_csvs.zip");
        status.textContent = "CSVファイルをZIPで出力しました。";
      };
      reader.readAsArrayBuffer(file);
    }
  </script>
</body>
</html>