javascriptでCSVのinport,Export

chartGPTを使用して試したことのメモ書き

1.jsを使用してCSVをimportし、Tableを作成
2.Tableの値を編集
3.Table上のデータをCSVとして出力


```
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8" />
    <title>Editable Table with CSV Export</title>
</head>

<body>
    <input type="file" id="csvInput" accept=".csv" onchange="handleFileSelect()" />
    <table id="editableTable">
        <!-- ヘッダー行はここに追加されます -->
    </table>

    <button onclick="exportTableToCSV()">Export to CSV</button>
    <button onclick="addRow()">Add Row</button>

    <script>
        function handleFileSelect() {
            const fileInput = document.getElementById('csvInput');
            const table = document.getElementById('editableTable');

            const file = fileInput.files[0];

            if (file) {
                const reader = new FileReader();

                reader.onload = function (e) {
                    const csvData = e.target.result;
                    displayCSVData(csvData, table);
                };

                reader.readAsText(file);
            }
        }

        function displayCSVData(csvData, table) {
            // CSVデータをパース
            const rows = csvData.split('\n');

            // ヘッダー行を処理
            const headerRow = table.createTHead().insertRow(0);
            const headers = rows[0].split(',');
            headers.forEach(header => {
                const th = document.createElement('th');
                th.textContent = header;
                headerRow.appendChild(th);
            });

            // データ行を処理
            for (let i = 1; i < rows.length; i++) {
                const rowData = rows[i].split(',');
                const newRow = table.insertRow(i);

                rowData.forEach(data => {
                    const cell = newRow.insertCell();
                    const editableContent = document.createElement('div');
                    editableContent.contentEditable = true;
					editableContent.classList.add('valueId');
                    editableContent.textContent = data;
                    cell.appendChild(editableContent);
                });
            }
        }

        function convertToCSV(data, header) {
            const rows = [];
            const header_length = header.length
            // データを3列に整理
            for (let i = 0; i < data.length; i += header_length) {
                const row = Array.from(data.slice(i, i + header_length));
                rows.push(row.join(','));
            }

            // CSVデータを文字列に変換
            //return rows.join('\n');
            return rows;
        }

        function exportTableToCSV() {
            const table = document.getElementById("editableTable");
            const elements = document.querySelectorAll('.valueId');
            const values = Array.from(elements).map(element => element.innerText);
            console.log(values);
            // CSVデータを格納する変数
            let csvData = [];

            // ヘッダー行
            const header = Array.from(table.querySelectorAll("thead th")).map(th => th.innerText);
            csvData.push(header.join(','));
            console.log(header)
            console.log(csvData)
            const rowdatas = convertToCSV(values,header);
            // データ行

            for (let i = 0; i < rowdatas.length; i++) {
                const rowData = Array.from(rowdatas[i].split(","))
                csvData.push(rowData.join(','));
            }

            // CSVデータを文字列に変換
            const csvString = csvData.join('\n');
            // CSVデータをファイルとしてダウンロード
            const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' });
            const link = document.createElement("a");

            if (link.download !== undefined) {
                const url = URL.createObjectURL(blob);
                link.setAttribute("href", url);
                link.setAttribute("download", "table_export.csv");
                link.style.visibility = 'hidden';
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            }
        }

        function addRow() {
            const table = document.getElementById("editableTable");
            const newRow = table.insertRow(table.rows.length);

            // 各セルにinputを追加
            for (let i = 0; i < table.rows[0].cells.length; i++) {
                const cell = newRow.insertCell(i);
                const editableContent = document.createElement("div");
                editableContent.contentEditable = true;
				editableContent.classList.add('valueId')
                cell.appendChild(editableContent);
            }
        }
    </script>
</body>

</html>
```

他の関数との組み合わせ？？？
```
let initialCsvData = null;

function loadCsvData(csvFilePath) {
  if (initialCsvData !== null) {
    // If data is already loaded, return a resolved Promise with the existing data
    return Promise.resolve(initialCsvData);
  }

  // Otherwise, load the CSV data
  return fetch(csvFilePath)
    .then(response => response.text())
    .then(data => {
      initialCsvData = data;
      return data;
    })
    .catch(error => {
      console.error('Error loading CSV file:', error);
      throw error;
    });
}

function updateFunction() {
  // Example: Load the first CSV data or reuse existing data
  loadCsvData('first_csv_file.csv')
    .then(data => {
      initializeChart(data);
      // You can call createTable or other functions using the same data
      createTable(data);
    })
    .catch(error => {
```