我有一个类似于此文件的.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 package' 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 的Collection。收藏品应如下所示:
// First entry:
Parameter = {
ID: 101;
SubID: 5;
No: 0;
//...
}
// Second entry:
Parameter = {
ID: 101;
SubID: 30;
No:1;
//...
}
...
有谁知道将数组转换为Collection的智能方法?
非常感谢大家!
答案 0 :(得分: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);

答案 1 :(得分:0)
你可以这样做很容易
///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
function convertCVS(strData, delemeter) {
delemeter = delemeter || ";"
var lines = strData.split("\n")
var keys = lines.shift().split(delemeter)
return lines.map(function(line){
var object = {};
var values = line.split(delemeter);
for (var i = 0; i < keys.length; i++) {
object[key[i]] = values [i];
}
return object;
});
}
快乐编码^^
答案 2 :(得分:0)
正如@Danial所建议的,我们可以使用convertCVS函数进行一些修改,作为函数名convertCSVtoCollection:
function convertCSVtoCollection(strData, delimiter) {
var result=[];
delimiter = delimiter || ";"
var lines = strData.split("\n")
var keys = lines.shift().split(delimiter)
lines.map(function(line){
var object = {};
var values = line.split(delimiter);
for (var i = 0; i < keys.length; i++) {
object[keys[i]] = values [i];
}
result.push({"parameter":object});
});
return result;
}
它会给你想要的结果。希望它对你有用..