Skip to content

Instantly share code, notes, and snippets.

@Tachibana446
Created March 19, 2023 14:55
Show Gist options
  • Save Tachibana446/2cafa9ea7df097f048360da7dad15bfe to your computer and use it in GitHub Desktop.
Save Tachibana446/2cafa9ea7df097f048360da7dad15bfe to your computer and use it in GitHub Desktop.
お気に入りのデータをCSV化するコード
// テーブルからデータを取得する
const headers = ['work_name', 'maker_name', 'sales_date', 'work_text', 'purchased'];
function getTableData() {
let dataList = [];
const trs = document.getElementsByTagName("tr");
for (let i = 0; i < trs.length; i++) {
const data = {};
for (let j = 0; j < headers.length; j++) {
const className = headers[j];
const element = trs[i].querySelector(`.${className}`);
if (element) {
if (className == "work_name") {
const a = element.querySelector("a");
if (a) {
const text = a.textContent.trim();
if (text !== "") {
data[className] = text;
}
}
} else {
const text = element.textContent.trim();
if (text !== "") {
data[className] = text;
}
}
}
if (className == 'purchased') {
let value = checkPurchased(trs[i]);
if (value != undefined)
data[className] = value;
}
}
if (Object.keys(data).length > 0)
dataList.push(data);
}
dataList = dataList.filter(dict => {
return Object.values(dict).some(val => val != "");
});
return dataList;
}
// ボタンの状態から購入済みかどうかを判定する
function checkPurchased(element) {
const target_text = "視聴";
const buttons = element.querySelectorAll(".work_btn_list .work_btn_list_item");
if (!buttons) {
return undefined;
}
for (let i = 0; i < buttons.length; i++) {
if (buttons[i].textContent.includes(target_text)) {
return true;
}
}
return false;
}
// データを整形する
function cleanUpData(data_list) {
for (var i = 0; i < data_list.length; i++) {
var data = data_list[i];
for (var j = 0; j < headers.length; j++) {
let attr = headers[j];
let value = data[attr];
var new_value = value;
// 日付の置き換え
if (attr == 'sales_date' && value) {
const regex = /(\d{4})年(\d{2})月(\d{2})日/;
const match = value.match(regex);
const dateString = `${match[1]}-${match[2]}-${match[3]}`;
new_value = dateString
}
if (new_value != value) {
data[attr] = new_value;
}
}
}
return data_list;
}
// データをCSV形式に変換する
function convertToCSV(data_list) {
var csvContent = headers.join(',') + '\n';
for (var i = 0; i < data_list.length; i++) {
var line = '';
var data = data_list[i];
for (var j = 0; j < headers.length; j++) {
let value = data[headers[j]];
if (value) {
if (typeof value != 'string')
value = "" + value;
value = value.replace(/"/g, '""');
value = value.replace("\n", "");
line += '"' + value + '",';
}
else
line += '"",';
}
csvContent += line.slice(0, -1) + '\n';
}
return csvContent;
}
// CSVをダウンロードする
function downloadCSV(csvContent, fileName) {
var blob = new Blob([csvContent], { type: 'text/csv' });
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, fileName);
} else {
var url = URL.createObjectURL(blob);
var link = document.createElement('a');
link.setAttribute('href', url);
link.setAttribute('download', fileName);
link.click();
}
}
// テーブルからCSVを生成し、ダウンロードする
var data_list = getTableData();
data_list = cleanUpData(data_list);
var csvContent = convertToCSV(data_list);
downloadCSV(csvContent, 'data.csv');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment