Превратить массив строк в формат CSV - PullRequest
0 голосов
/ 20 января 2019

У меня есть массив строк:

let transactions = [
    "   Date     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019  ||          ||  9.00  ||  162.00",
    "20/01/2019  ||  90.00  ||          ||  171.00",
    "20/01/2019  ||          ||  9.00  ||  81.00",
    "20/01/2019  ||  90.00  ||          ||  90.00"
];

Я включил это, используя transactions.replace(/\s/g, '')

"Date||Credit||Debit||Balance20/01/2019||||9.00||162.0020/01/2019||90.00||||171.0020/01/2019||||9.00||81.0020/01/2019||90.00||||90.00"

и я пытаюсь удалить все | из него и заменить их запятыми.

Это на самом деле не работает transactions.replace(/|{2,}/g,","):

ошибка Недопустимое регулярное выражение: / | {2} /: повторять нечего

И transactions.replace(/|{+}/g,",") возвращает:

",D,a,t,e,|,|,C,r,e,d,i,t,|,|,D,e,b,i,t,|,|,B,a,l,a,n,c,e,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,1,6,2,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,1,7,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,|,|,9,.,0,0,|,|,8,1,.,0,0,2,0,/,0,1,/,2,0,1,9,|,|,9,0,.,0,0,|,|,|,|,9,0,.,0,0,"

Все, что я хочу, это формат CSV:

"Date,Credit,Debit,Balance,20/01/2019,,9.00,162.00,20/01/2019,90.00,,171.00,20/01/2019,,9.00,81.00,20/01/2019,90.00,,90.00"

Ответы [ 5 ]

0 голосов
/ 20 января 2019

Другим подходом может быть использование нового экспериментального flatMap () для сопоставления каждого string массива, разделенного на ||, а затем применения trim() к каждому элементу этого нового массива дляудаляя лишние пробелы, этот новый массив будет затем сглаживаться, и, наконец, мы можем объединить все элементы с , для получения требуемого псевдо CSV.Обратите внимание, что этот подход сохранит соответствующие пробелы, например, Date And Time не будет изменен на DateAndTime.

let transactions = [
    "   Date And Time     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019 09:57:00  ||          ||  9.00  ||  162.00",
    "20/01/2019 10:20:12 ||  90.00  ||          ||  171.00",
    "20/01/2019 14:17:30 ||          ||  9.00  ||  81.00",
    "20/01/2019 21:00:30 ||  90.00  ||          ||  90.00"
];

let out = transactions.flatMap(str => str.split("||").map(e => e.trim())).join(",");

console.log(out);

Однако, если вы хотите настоящий CSV формат:

CSV - это формат данных с разделителями, разделенный полями / столбцами, разделеннымисимвол запятой и записи / строки, оканчивающиеся символом новой строки.

Затем следует рассмотреть возможность добавления символа new line (\n) к каждой новой строке данных, как при следующем подходе:

let transactions = [
    "   Date And Time     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019 09:57:00  ||          ||  9.00  ||  162.00",
    "20/01/2019 10:20:12 ||  90.00  ||          ||  171.00",
    "20/01/2019 14:17:30 ||          ||  9.00  ||  81.00",
    "20/01/2019 21:00:30 ||  90.00  ||          ||  90.00"
];

let out = transactions.map(
    str => str.split("||").map(e => e.trim()).join(",")
).join("\n");

console.log(out);
0 голосов
/ 20 января 2019

Вы можете объединить элементы массива с помощью || и использовать замену, а в функции обратного вызова использовать функцию, основанную на возвращении захваченной группы '' или ,.

Это спасет вас, если использовать замену дважды.

let str = ["   Date     ||  Credit   ||  Debit   ||  Balance  ", "20/01/2019  ||          ||  9.00  ||  162.00", "20/01/2019  ||  90.00  ||          ||  171.00", "20/01/2019  ||          ||  9.00  ||  81.00", "20/01/2019  ||  90.00  ||          ||  90.00"];

let op = str.join('||').replace(/(\s+)|(\|\|)/g,
   function(match,firstMatch, secondMatch){
   return firstMatch ? '' : ','
})
console.log(op)
0 голосов
/ 20 января 2019

Я не использую регулярные выражения, но я ожидаю, что .replace(/\|+/g,",") сработает.(Он должен найти любое количество последовательных символов канала и заменить партию одной запятой.)

0 голосов
/ 20 января 2019

Вы можете использовать этот код:

let output = transactions.join('||').replace(/\s/g, '').replace(/\|\|/g, ',');
0 голосов
/ 20 января 2019

Вы можете сделать это, чтобы заменить все '||' строки на ',' char:

let output = transactions.split('||').join(',')

Также похоже, что ваш первый .replace не добавляет '||'между элементами в массиве, поэтому я бы рекомендовал сначала использовать transactions.join('||'), а затем двигаться вперед с вашим .replace, а затем с моим кодом выше.

Вот как будет выглядеть полный код:

let transactions = [
    "   Date     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019  ||          ||  9.00  ||  162.00",
    "20/01/2019  ||  90.00  ||          ||  171.00",
    "20/01/2019  ||          ||  9.00  ||  81.00",
    "20/01/2019  ||  90.00  ||          ||  90.00"
];

let output = transactions.join('||') // 1. combine array with 2 '|' chars
    .replace(/\s/g, '')              // 2. remove all space characters
    .split('||').join(',');          // 3. replace '||' str with ','

console.log(output);

Если вы хотите придерживаться функции .replace, вы можете использовать:

let output = transactions.replace(/\|{2}/g, ',');

Это соответствует 2 экземплярам символа '|'рядом друг с другом, где угодно в исходной строке, и заменяет их на ','.Это очень похоже на то, что у вас было, но, как упоминал @Dan Dascalescu, вы должны экранировать символ | в регулярном выражении И , вы должны избавиться от запятой в фрагменте {2,}, так какбудет соответствовать 2 или более '|' символов.

Вот как это будет выглядеть в полном коде:

let transactions = [
    "   Date     ||  Credit   ||  Debit   ||  Balance  ",
    "20/01/2019  ||          ||  9.00  ||  162.00",
    "20/01/2019  ||  90.00  ||          ||  171.00",
    "20/01/2019  ||          ||  9.00  ||  81.00",
    "20/01/2019  ||  90.00  ||          ||  90.00"
];

let output = transactions.join('||') // 1. combine array with 2 '|' chars
    .replace(/\s/g, '')              // 2. remove all space characters
    .replace(/\|{2}/g, ',');         // 3. replace '||' with ','

console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...