Если вы пытаетесь рассчитать время начала из строки в формате HHMMSS, этот метод кажется мне намного проще:
select cast(stuff(stuff(right('0000000' + str, 6), 5, 0, ':'), 3, 0, ':') as time)
from (values ('120609'), ('0'), ('1001')) v(str)
var csv = "FirstName,LastName,dob,phone"+
"John,Smith,10/01/1998,21234123"+
"Millie,Henderson,23/03/2000,21768345"+
"Briana,Wright,23/03/1976,22321467";
function csvJSON(csv){
var values=csv.split(',');
var index =-1;
var lines = [];
for(var i=0;i<values.length; i++){
lines[index] = lines[index]+ values[i]+ ",";
if (i % 4==0){
index++;
}
}
var result = [];
var headers=lines[0].split(',');
lines.splice(0, 1);
lines.forEach(function(line) {
var obj = {};
var currentline = line.split(',');
headers.forEach(function(header, i) {
obj[header] = currentline[i];
});
result.push(obj);
});
return result; //JavaScript object
//return JSON.stringify(result); //JSON
}
console.log(csv)
console.log(csvJSON(csv))
Среди прочих проблем вы объединяете весь CSV-файл без разрывов строк. Ваша завершенная строка будет иметь «phoneJohn» в качестве одной строки и «21234123Millie» в качестве другой, потому что нет символов, разделяющих их. Похоже, что код, который вы написали, ожидает запятую между ними, но простое объединение двух строк "like"+"this"
в javascript приведет к строке "likethis
", и вы не сможете снова разделить их. [112 ]
Разделить CSV в строке через \n
и col через ,
. Используйте код для преобразования любого CSV в JSON. ключом объекта будет заголовок csv.
var csv = `FirstName,LastName,dob,phone
John,Smith,10/01/1998,21234123
Millie,Henderson,23/03/2000,21768345
Briana,Wright,23/03/1976,22321467`;
function csvJSON(csv) {
//split csv data with \n get all rows of csv
var rows = csv.split('\n');
//index of 0 is header then split header string with ,
var headers = rows[0].split(',');
//remove headers index 0 from rows
rows = rows.splice(1);
var result = [];
rows.forEach(function (row) {
var obj = {};
//split data row with ,
var values = row.split(',');
headers.forEach(function (key, index) {
obj[key] = values[index];
});
result.push(obj);
})
return result;
}
console.log(csvJSON(csv))
Во-первых, ваши тестовые данные не имеют разделителя строк - строка запускается. Вот код, который я только что скомбинировал, чтобы сделать то, что вы пытаетесь сделать (с такими опциями, как пользовательские разделители). Дайте мне знать, если у вас есть какие-либо вопросы:
var testData = "FirstName,LastName,dob,phone"+"\n"+
"John,Smith,10/01/1998,21234123"+"\n"+
"Millie,Henderson,23/03/2000,21768345"+"\n"+
"Briana,Wright,23/03/1976,22321467"+"\n";
function csvToJson(data, customOptions) {
// Default options. Override with passed in parameters
var options = {
hasHeaderRow: true,
fieldDelimiter: ",",
rowDelimiter: "\n"
};
if (typeof customOptions === 'object' && customOptions !== null) {
for (var option in customOptions) {
if (options.hasOwnProperty(option)) {
options[option] = customOptions[option];
}
}
}
// Break into rows
var rows = data.split(options.rowDelimiter);
if (rows instanceof Array !== true || rows.length == 0) {
console.log("No rows found or invalid row delimiter.");
return;
}
// Determine field count
var fieldCount = parseInt(rows[0].split(options.fieldDelimiter).length);
// Parse header
if (options.hasHeaderRow == true) {
var headerRow = rows.shift();
} else {
var headerRowPlaceholders = [];
for (var i = 1; i < fieldCount + 1; i++) {
headerRowPlaceholders.push('field'+i);
}
var headerRow = headerRowPlaceholders.join(options.fieldDelimiter);
}
headerRow = headerRow.split(options.fieldDelimiter);
// Convert rows to objects
for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
var rowObject = {};
var rowData = rows[rowIndex].split(options.fieldDelimiter);
if (rowData.length === fieldCount) {
for (var headerIndex = 0; headerIndex < headerRow.length; headerIndex++) {
rowObject[headerRow[headerIndex]] = rowData[headerIndex];
}
rows[rowIndex] = rowObject;
} else {
rows.splice(rowIndex, 1);
}
}
return rows;
}
var result = csvToJson(testData, {
hasHeaderRow: true,
fieldDelimiter: ",",
rowDelimiter: "\n"
});
console.log(result);
Поскольку в конечном итоге предполагается использовать в качестве входных данных настоящие csv-файлы, вам нужно убедиться, что все ваши значения разделены запятыми. Я уверен, что именно так работают файлы CSV .... может быть неправильно. В конце каждой строки у вас нет запятой. Я исправил это в моем фрагменте ниже.
Я также исправил использование 4 столбцов (у вас, кажется, есть 4 заголовка, но вы пытаетесь использовать только 3?), Переместил строку index ++ на перед тем, как использовать , перед проверкой на неопределенные значения объединение строк и удаление пустого заголовка.
var csv = "FirstName,LastName,dob,phone,"+
"John,Smith,10/01/1998,21234123,"+
"Millie,Henderson,23/03/2000,21768345,"+
"Briana,Wright,23/03/1976,22321467";
function csvJSON(csv){
var values=csv.split(',');
var index =-1;
var lines = [];
for(var i=0;i<values.length; i++){
if (i % 4==0){
index++;
}
if (typeof lines[index] === 'undefined') lines[index] = "";
lines[index] = lines[index]+ values[i]+ ",";
}
var result = [];
var headers=lines[0].split(',').splice(0, lines.length);
lines.splice(0, 1);
lines.forEach(function(line) {
var obj = {};
var currentline = line.split(',');
headers.forEach(function(header, i) {
obj[header] = currentline[i];
});
result.push(obj);
});
return result; //JavaScript object
//return JSON.stringify(result); //JSON
}
console.log(csvJSON(csv))