作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个与此类似的 .txt 文件。
ID;SubID;No.;Name;Min;Max;Default;Factor;Unit
101;5;0;Gas flow time;0;100;0.1;10;s
101;30;1;Start speed;20;200;120;1;m/s
;;2;Start current;0;999;1.0;10;A
我使用 npm 包“fs” 和 readFile 导入此 .txt 文件,并使用 CSVToArray 将其转换为数组。在这里您可以找到我用于转换的代码。
function CSVToArray( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not, then default to comma.
strDelimiter = (strDelimiter || ";");
// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
(
// Delimiters.
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
// Quoted fields.
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
// Standard fields.
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
// Create an array to hold our data. Give the array a default empty first row.
var arrData = [[]];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;
// Keep looping over the regular expression matches until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){
// Get the delimiter that was found.
var strMatchedDelimiter = arrMatches[ 1 ];
// Check to see if the given delimiter has a length (is not the start of string) and if it matches
// field delimiter. If id does not, then we know that this delimiter is a row delimiter.
if (
strMatchedDelimiter.length &&
strMatchedDelimiter !== strDelimiter
){
// Since we have reached a new row of data, add an empty row to our data array.
arrData.push( [] );
}
var strMatchedValue;
// Now that we have our delimiter out of the way, let's check to see which kind of value we
// captured (quoted or unquoted).
if (arrMatches[ 2 ]){
// We found a quoted value. When we capture this value, unescape any double quotes.
strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
// We found a non-quoted value.
strMatchedValue = arrMatches[ 3 ];
}
// Now that we have our value string, let's add it to the data array.
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
// Return the parsed data.
return( arrData );
现在我想从 CSVToArray 返回的数组中创建一个名为 Parameter 的集合。该集合应如下所示:
// First entry:
Parameter = {
ID: 101;
SubID: 5;
No: 0;
//...
}
// Second entry:
Parameter = {
ID: 101;
SubID: 30;
No:1;
//...
}
...
有人知道将数组转换为集合的聪明方法吗?
非常感谢大家!
最佳答案
我建议您保持现有的 CSVToArray 不变,并添加另一个进行最终转换的函数:
function tableToObjectArray(arrData) {
var keys = arrData[0];
return arrData.slice(1).map(function (row) {
return row.reduce(function (obj, val, idx) {
obj[keys[idx]] = val;
return obj;
}, {});
});
}
您可以使用 CSVToArray 的输出来调用它:
var arrData = CSVToArray(input, ';');
var objData = tableToObjectArray(arrData);
这是一个工作片段:
// Original left unchanged:
function CSVToArray( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not, then default to comma.
strDelimiter = (strDelimiter || ";");
// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
(
// Delimiters.
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
// Quoted fields.
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
// Standard fields.
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
// Create an array to hold our data. Give the array a default empty first row.
var arrData = [[]];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;
// Keep looping over the regular expression matches until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){
// Get the delimiter that was found.
var strMatchedDelimiter = arrMatches[ 1 ];
// Check to see if the given delimiter has a length (is not the start of string) and if it matches
// field delimiter. If id does not, then we know that this delimiter is a row delimiter.
if (
strMatchedDelimiter.length &&
strMatchedDelimiter !== strDelimiter
){
// Since we have reached a new row of data, add an empty row to our data array.
arrData.push( [] );
}
var strMatchedValue;
// Now that we have our delimiter out of the way, let's check to see which kind of value we
// captured (quoted or unquoted).
if (arrMatches[ 2 ]){
// We found a quoted value. When we capture this value, unescape any double quotes.
strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
// We found a non-quoted value.
strMatchedValue = arrMatches[ 3 ];
}
// Now that we have our value string, let's add it to the data array.
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
// Return the parsed data.
return( arrData );
}
// New function added:
function tableToObjectArray(arrData) {
var keys = arrData[0];
return arrData.slice(1).map(function (row) {
return row.reduce(function (obj, val, idx) {
obj[keys[idx]] = val;
return obj;
}, {});
});
}
// Sample data:
var input = `ID;SubID;No.;Name;Min;Max;Default;Factor;Unit
101;5;0;Gas flow time;0;100;0.1;10;s
101;30;1;Start speed;20;200;120;1;m/s
;;2;Start current;0;999;1.0;10;A`;
// Convert to 2D array
var arrData = CSVToArray(input, ';');
// Convert to object array
var objData = tableToObjectArray(arrData);
// Output result:
console.log(objData);
关于javascript - 如何将数组转换为集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38392180/
我是一名优秀的程序员,十分优秀!