Javascript 如何将数据写入一个csv文件?

Javascript 如何将数据写入一个csv文件?,javascript,firebase-realtime-database,export-to-csv,Javascript,Firebase Realtime Database,Export To Csv,我目前正在尝试将firebase中的数据写入csv文件。它有点工作,但我有三个不同的文件,我不知道如何解决这个问题。此时此刻,我非常困惑 你知道怎么解决这个烂摊子吗 这是我的JSON: { "records" : { "id1" : { "2020-08-11 15:40:13" : { "0" : "5" }, "2020

我目前正在尝试将firebase中的数据写入csv文件。它有点工作,但我有三个不同的文件,我不知道如何解决这个问题。此时此刻,我非常困惑

你知道怎么解决这个烂摊子吗

这是我的JSON:

{
  "records" : {
    "id1" : {
      "2020-08-11 15:40:13" : {
        "0" : "5"
      },
      "2020-08-11 16:35:09" : {
        "0" : "18"
      }
    },
    "id2" : {
      "2020-08-11 17:23:34" : {
        "0": "5"
      }
    },
    "id3" : {
      "2020-08-11 09:38:53" : {
        "0": "4"
      }
    },
    "id4" : {
      "2020-08-11 13:41:30" : {
        "0": "2"
      },
      "2020-08-11 13:41:44" : {
        "0": "3"
      }
    }
  }
}


基本上,我希望获得所有ID并将它们写入csv文件的一列中。 “测试”条目只是其他数据条目的占位符

以下是我到目前为止的情况:

function downloadData(){
    var db = firebase.database().ref();
    var dbRef = db.child('records');
    
    dbRef.once('value', function(snapshot) {
        snapshot.forEach(function(childSnapshot) {
            var childKey = childSnapshot.key;
            var b = [childKey, 'iwannasleep'];
            // console.log(childKey); 
            // console.log(b);

            var data = [b];
            console.log(data);



// ------------- export into csv ---------------


            var arrayHeader = ["user_id", "test"] 

            var csv = arrayHeader.join(',') + '\n';
            data.forEach( function(row) {
                csv += row.join(',');
                csv += "\n";
            });
        
            console.log(csv);

            var hiddenElement = document.createElement('a');
            hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);;
            hiddenElement.target = '_blank';
            hiddenElement.download = 'data.csv';
            hiddenElement.click();
        
        });
      });
}

正如RobIII所评论的,您正在for循环中创建一个下载链接,这意味着您正在为每行数据创建一个单独的元素

您将希望将其从循环中拉出:

var db = firebase.database().ref();
var dbRef = db.child('dataRecordings');

dbRef.once('value', function(snapshot) {
    var arrayHeader = ["user_id", "test"] 
    var csv = arrayHeader.join(',') + '\n';

    snapshot.forEach(function(childSnapshot) {
        var childKey = childSnapshot.key;
        var b = [childKey, 'iwannasleep'];

        var data = [b];

        data.forEach(function(row) {
            csv += row.join(',');
            csv += "\n";
        });    
    });
    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);;
    hiddenElement.target = '_blank';
    hiddenElement.download = 'data.csv';
    hiddenElement.click();
});

更新:您的问题中JSON发生了什么的示例:

const json={
“记录”:{
“id1”:{
"2020-08-11 15:40:13" : {  "0" : "5" },
"2020-08-11 16:35:09" : { "0" : "18" }
},
“id2”:{
"2020-08-11 17:23:34" : { "0": "5" }
},
“id3”:{
"2020-08-11 09:38:53" : { "0": "4" }
},
“id4”:{
"2020-08-11 13:41:30" : { "0": "2" },
"2020-08-11 13:41:44" : { "0": "3" }
}
}
}
var arrayHeader=[“用户id”,“测试”]
var csv=arrayHeader.join(',')+'\n';
Object.keys(json.records).forEach((childKey)=>{
var b=[childKey,'iwannasleep'];
var数据=[b];
data.forEach(函数(行){
csv+=行连接(',');
csv+=“\n”;
});    
});

console.log(csv)
您实际上是在
forEach
中打开一个文件(或者更确切地说:创建一个包含可下载内容的隐藏元素)。这将打开一个文件“for each”记录…非常感谢您的提示:)它仍然无法按我希望的方式工作,但它节省了我很多时间我已经尝试过了,但现在我只获得了第一个id,仅此而已。我也尝试过在forEach函数之外使用它,连接数组并将它们连接在一起等等,但我总是得到相同的结果。但是非常感谢您的提示:)它节省了我很多时间我不确定您的数据结构是什么样子,但我非常确定我的代码没有改变任何关于如何提取实际数据的内容。如果您仍然对此有问题,请编辑您的问题以包含实际的JSON(作为文本,没有屏幕截图)。您可以通过单击溢出菜单中的“导出JSON”链接来实现这一点(⠇) 在您的上。我在我的回答中添加了一个独立的代码实现。如果您运行代码段,您应该会看到与本地相同的输出。如果确实是这样:您希望从这个输入中得到什么输出?我希望id不在记录中。因此会有用户id,test作为标头,然后是id1,iwannaslee下一行的p,id2,下面的iwannasleep等等。我知道我的方法有很多错误,因为它不起作用,但我不知道要改变什么。我更新了答案中的代码,以生成我想你知道的输出。