Created
March 19, 2023 14:55
-
-
Save Tachibana446/2cafa9ea7df097f048360da7dad15bfe to your computer and use it in GitHub Desktop.
お気に入りのデータをCSV化するコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// テーブルからデータを取得する | |
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