node.js - 如何从 Axios GET 请求解析 Node/Express 上的 CSV 文件?
问题描述
我正在向 URL 端点发出 GET 请求,该端点使用 axios 在 Node/Express 设置上发回 CSV 文件。
如何读取此文件并将其解析为包含每行数据对象的数组?我喜欢“neat-csv”如何处理解析的示例,但我愿意接受建议。
const response = await axios.get("url/end/point",{ responseType: 'blob',});
到目前为止,除了请求之外,我没有任何实际的实现示例,因为我对从哪里开始没有明确的看法,而且我在网上找不到任何好的指南。我找到的所有指南都涉及请求一个文件,然后将其保存到我不想要的文件系统中。我只是想请求文件,解析它,然后通过我拥有的 Socket.io 连接广播 CSV 文件中的数据。
Logginresponse.data
清楚地给出了数据输出,但当然没有格式化。只是原始数据/文本。
在响应中有一个Content-Disposition
参数读取attachment; filename=name_of_file.csv
如果这有帮助?
提前干杯和感谢!
解决方案
可能您已经找到了答案,但我认为值得在这里添加一些内容,以防万一:
1) 从 URL 获取 CSV
因此,您从 axios 请求中将 CSV 作为 BLOB 获取。到目前为止,一切都很好!正如你所说:
const response = await axios.get("url/end/point",{ responseType: 'blob',});
const file = response.data;
在这里,您可以(并在网上找到)不同的方法来制作对象。
2) 以字符串形式获取值
首先,要将其记录为正确的字符串,您可以执行以下操作:
file.text().then((csvStr) => {
console.log(csvStr);
})
它将记录如下内容(作为字符串):
Title1,Title2,Title3
one,two,three
example1,example2,example3
3)将其解析为对象
在这里,您有不同的选择。主要是:
A) 编写自己的函数将字符串作为 CSV 解析为对象
我在 StackOverflow 上找到的一个很好的例子来自 Wesley Smith 的这个回答
function csvJSON(csvStr){
var lines=csvStr.split("\n");
var result = [];
// NOTE: If your columns contain commas in their values, you'll need
// to deal with those before doing the next step
// (you might convert them to &&& or something, then covert them back later)
// jsfiddle showing the issue https://jsfiddle.net/
var headers=lines[0].split(",");
for(var i=1;i<lines.length;i++){
var obj = {};
var currentline=lines[i].split(",");
for(var j=0;j<headers.length;j++){
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
return result; //JavaScript object
}
现在,如果你这样做:
const jsonObj = csvJSON(csvStr);
console.log(jsonObj);
您将以所需jsonObj
对象的形式进入 CSV!
B)使用一些为你做的第三方库
在这里,您可能会找到一些选项。随意选择你喜欢的任何东西。我选择了CSVTOJSON并将按照相同的示例显示它:
import csvToJson from 'csvtojson';
...
csvToJson()
.fromString(csvStr)
.then((jsonObj)=>{
console.log(jsonObj);
});
像这样,您还将jsonObj
以所需对象的形式进入 CSV!
使用任何选项A或B,您将获得:
注意:
在这两个选项中,您可能必须在then()
块内实现转换,因为当您准备好使用字符串值时它就在那里:
...
file.text().then((csvStr) => {
// Option A
const jsonObj1 = csvJSON(csvStr);
console.log(jsonObj1);
// Option B
csvToJson()
.fromString(csvStr)
.then((jsonObj2)=>{
console.log(jsonObj2);
})
});
选择什么选项?
这取决于您和您使用的 CSV 文件。最好考虑:
- 如果您有一个众所周知的小文件,那么使用第三方库可能是矫枉过正。
- 另一方面,当您的文件可能包含一些棘手的内容(如内部逗号、其他一些分隔符或可能导致转换失败的额外字符)时,实现您自己的函数,那么函数可能需要额外的工作,因此会让人头疼。
- 您可能要考虑的其他一些事情是文件的大小。如果它非常大,并且您正在实现自己的功能,那么您将希望以一种非常高效的方式来完成它。如果您使用的是第三方库(一个不错的库),则不必为此担心太多。
推荐阅读
- javascript - 编码的 UI - C# - 时间 itemprop 标记 - 如何验证年份是否存在
- python - 如何使用给定的数据库在 django 的方法中进行查询?
- firebase - Firebase 动态链接域未按预期创建
- concourse - 大厅:资源脚本'/opt/resource/check []'失败:退出状态128
- ethereum - 如何将多维数组中的元素推入固定坐标的某个坐标?
- javascript - 类更改 jquery sdk 的观察者
- php - 网页不打印winsock信息
- python - 如何格式化 HTTP 请求
- react-native - 如何在 React Native 中逐行突出显示文本
- sql - 如何计算Oracle中两个日期之间的闰年数?