Работа с запятыми в файле CSV
Я ищу предложения о том, как обрабатывать CSV-файл, который создается, затем загружается нашими клиентами и может иметь запятую в значении, например, в названии компании.
Вот некоторые идеи, которые мы рассматриваем: цитируемые идентификаторы (значение, значения, и т. Д.) Или использование | вместо запятой. Самая большая проблема заключается в том, что нам нужно сделать это проще, иначе клиент этого не сделает.
29 ответов
Как уже говорили другие, вам нужно избегать значений, которые включают кавычки. Вот небольшой CSV-ридер в C♯, который поддерживает значения в кавычках, включая встроенные кавычки и возврат каретки.
Кстати, это код, проверенный модулем. Я публикую его сейчас, потому что этот вопрос, кажется, часто поднимается, и другие могут не захотеть целую библиотеку, когда подойдет простая поддержка CSV.
Вы можете использовать его следующим образом:
using System;
public class test
{
public static void Main()
{
using ( CsvReader reader = new CsvReader( "data.csv" ) )
{
foreach( string[] values in reader.RowEnumerator )
{
Console.WriteLine( "Row {0} has {1} values.", reader.RowIndex, values.Length );
}
}
Console.ReadLine();
}
}
Вот классы. Обратите внимание, что вы можете использовать Csv.Escape
функция для записи действительного CSV, а также.
using System.IO;
using System.Text.RegularExpressions;
public sealed class CsvReader : System.IDisposable
{
public CsvReader( string fileName ) : this( new FileStream( fileName, FileMode.Open, FileAccess.Read ) )
{
}
public CsvReader( Stream stream )
{
__reader = new StreamReader( stream );
}
public System.Collections.IEnumerable RowEnumerator
{
get {
if ( null == __reader )
throw new System.ApplicationException( "I can't start reading without CSV input." );
__rowno = 0;
string sLine;
string sNextLine;
while ( null != ( sLine = __reader.ReadLine() ) )
{
while ( rexRunOnLine.IsMatch( sLine ) && null != ( sNextLine = __reader.ReadLine() ) )
sLine += "\n" + sNextLine;
__rowno++;
string[] values = rexCsvSplitter.Split( sLine );
for ( int i = 0; i < values.Length; i++ )
values[i] = Csv.Unescape( values[i] );
yield return values;
}
__reader.Close();
}
}
public long RowIndex { get { return __rowno; } }
public void Dispose()
{
if ( null != __reader ) __reader.Dispose();
}
//============================================
private long __rowno = 0;
private TextReader __reader;
private static Regex rexCsvSplitter = new Regex( @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" );
private static Regex rexRunOnLine = new Regex( @"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$" );
}
public static class Csv
{
public static string Escape( string s )
{
if ( s.Contains( QUOTE ) )
s = s.Replace( QUOTE, ESCAPED_QUOTE );
if ( s.IndexOfAny( CHARACTERS_THAT_MUST_BE_QUOTED ) > -1 )
s = QUOTE + s + QUOTE;
return s;
}
public static string Unescape( string s )
{
if ( s.StartsWith( QUOTE ) && s.EndsWith( QUOTE ) )
{
s = s.Substring( 1, s.Length - 2 );
if ( s.Contains( ESCAPED_QUOTE ) )
s = s.Replace( ESCAPED_QUOTE, QUOTE );
}
return s;
}
private const string QUOTE = "\"";
private const string ESCAPED_QUOTE = "\"\"";
private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}
На 2017 год csv полностью указан - RFC 4180.
Это очень распространенная спецификация, полностью охватываемая многими библиотеками ( пример).
Просто используйте любую легкодоступную библиотеку csv - то есть RFC 4180.
На самом деле есть спецификация для формата CSV и способ обработки запятых:
Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки.
http://tools.ietf.org/html/rfc4180
Итак, чтобы иметь значения foo
а также bar,baz
, ты делаешь это:
foo,"bar,baz"
Еще одно важное требование для рассмотрения (также из спецификации):
Если двойные кавычки используются для включения полей, то двойная кавычка, появляющаяся внутри поля, должна быть экранирована, если перед ней стоит еще одна двойная кавычка. Например:
"aaa","b""bb","ccc"
Формат CSV использует запятые для разделения значений, значения, которые содержат возврат каретки, перевод строки, запятые или двойные кавычки, заключены в двойные кавычки. Значения, которые содержат двойные кавычки, заключаются в кавычки, и каждая буквальная кавычка экранируется непосредственно предшествующей кавычкой: например, 3 значения:
test
list, of, items
"go" he said
будет закодирован как:
test
"list, of, items"
"""go"" he said"
Любое поле может быть заключено в кавычки, но только поля, содержащие запятые, CR/NL или кавычки, должны быть заключены в кавычки.
Не существует реального стандарта для формата CSV, но почти все приложения следуют соглашениям, описанным здесь. RFC, о котором упоминалось в другом месте, не является стандартом для CSV, это RFC для использования CSV в MIME и содержит некоторые нетрадиционные и ненужные ограничения, которые делают его бесполезным вне MIME.
Причиной, которую многие CSV-модули, которые я видел, не приспосабливают, является тот факт, что несколько строк могут быть закодированы в одном поле, что означает, что вы не можете предполагать, что каждая строка является отдельной записью, либо вы не должны допускать переносы в вашем данные или будьте готовы справиться с этим.
Положите двойные кавычки вокруг строк. Это обычно то, что делает Excel.
Ала Эли,
вы избегаете двойных кавычек как двух двойных кавычек. Например, "test1","foo", "bar","test2"
Вы можете поставить двойные кавычки вокруг полей. Мне не нравится такой подход, так как он добавляет еще один специальный символ (двойная кавычка). Просто определите escape-символ (обычно с обратной косой чертой) и используйте его везде, где вам нужно что-то экранировать:
данные, больше данных, больше данных \, даже больше
Вам не нужно пытаться сопоставлять кавычки, и у вас меньше исключений для разбора. Это также упрощает ваш код.
Через Nuget доступна библиотека для работы с практически любым правильно сформированным CSV (.net) - CsvHelper
Пример для сопоставления с классом:
var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();
Пример для чтения отдельных полей:
var csv = new CsvReader( textReader );
while( csv.Read() )
{
var intField = csv.GetField<int>( 0 );
var stringField = csv.GetField<string>( 1 );
var boolField = csv.GetField<bool>( "HeaderName" );
}
Разрешение клиенту управлять форматом файла:,
стандартный разделитель полей, "
стандартное значение, используемое для экранирования полей, которые содержат разделитель, кавычку или окончание строки.
Использовать (например) #
для полей и '
для побега:
var csv = new CsvReader( textReader );
csv.Configuration.Delimiter = "#";
csv.Configuration.Quote = ''';
// read the file however meets your needs
Если вы работаете в *nix-системе, имейте доступ к sed
и может быть одна или несколько нежелательных запятых только в определенном поле вашего CSV, вы можете использовать следующую однострочную, чтобы заключить их в "
как RFC4180 Раздел 2 предлагает:
sed -r 's/([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*)/\1"\2"\3/' inputfile
В зависимости от того, в каком поле могут находиться нежелательные запятые, вам придется изменить / расширить группы захвата регулярного выражения (и подстановки).
В приведенном выше примере четвертое поле (из шести) будет заключено в кавычки.
В сочетании с --in-place
-опция, вы можете применить эти изменения непосредственно к файлу.
Чтобы "построить" правильное регулярное выражение, нужно следовать простому принципу:
- Для каждого поля в вашем CSV, которое стоит перед полем с нежелательной запятой (ями), вы пишете одно
[^,]*,
и собрать их всех вместе в группу захвата. - Для поля, которое содержит нежелательные запятую (ы) вы пишете
(.*)
, - Для каждого поля после поля с нежелательной запятой (ями) вы пишете один
,.*
и собрать их всех вместе в группу захвата.
Вот краткий обзор различных возможных регулярных выражений / замен в зависимости от конкретной области. Если не дано, замена \1"\2"\3
,
([^,]*)(,.*) #first field, regex
"\1"\2 #first field, substitution
(.*,)([^,]*) #last field, regex
\1"\2" #last field, substitution
([^,]*,)(.*)(,.*,.*,.*) #second field (out of five fields)
([^,]*,[^,]*,)(.*)(,.*) #third field (out of four fields)
([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*) #fourth field (out of six fields)
Если вы хотите удалить ненужные запятую (ы) с sed
вместо того, чтобы заключать их в кавычки, обратитесь к этому ответу.
Как упоминалось в моем комментарии к ответу гарпо, его решение хорошо и работает в большинстве случаев, однако в некоторых сценариях, когда запятые находятся непосредственно рядом друг с другом, они не разделяются на запятые.
Это связано с тем, что строка Regex неожиданно ведет себя как строка vertabim. Для правильного поведения все символы в строке регулярного выражения должны быть экранированы вручную без использования escape-кода vertabim.
То есть. Регулярное выражение должно быть таким, используя ручные экранированные символы:
",(?=(?:[^\"\"]*\"\"[^\"\"]*\"\")*(?![^\"\"]*\"\"))"
что переводится на ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
При использовании вертабимной строки @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
он ведет себя следующим образом, как вы можете увидеть, если вы отлаживаете регулярное выражение:
",(?=(?:[^"]*"[^"]*")*(?![^"]*"))"
Итак, в заключение, я рекомендую решение Harpo, но остерегайтесь этой маленькой ошибки!
Я включил в CsvReader немного необязательный отказоустойчивый, чтобы уведомить вас, если эта ошибка происходит (если у вас есть заранее известное количество столбцов):
if (_expectedDataLength > 0 && values.Length != _expectedDataLength)
throw new DataLengthException(string.Format("Expected {0} columns when splitting csv, got {1}", _expectedDataLength, values.Length));
Это может быть введено через конструктор:
public CsvReader(string fileName, int expectedDataLength = 0) : this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
_expectedDataLength = expectedDataLength;
}
В Европе у нас эта проблема должна появиться раньше, чем этот вопрос. В Европе мы используем все запятые для десятичной точки. Смотрите эти цифры ниже:
| American | Europe |
| ------------- | ------------- |
| 0.5 | 0,5 |
| 3.14159265359 | 3,14159265359 |
| 17.54 | 17,54 |
| 175,186.15 | 175.186,15 |
Поэтому невозможно использовать запятую для файлов CSV. По этой причине файлы CSV в Европе разделяются точкой с запятой ( ;
)
Такие программы, как Microsoft Excel, могут читать файлы с точкой с запятой, и можно переключаться с разделителя. Вы могли бы даже использовать вкладку (\t
) в качестве разделителя. Смотрите этот ответ от пользователя Ужина.
Вы можете использовать альтернативные "разделители", такие как ";" или "|" но самым простым может быть просто цитирование, которое поддерживается большинством (приличных) библиотек CSV и большинством приличных электронных таблиц.
Добавьте ссылку на Microsoft.VisualBasic (да, он говорит VisualBasic, но он работает и в C# точно так же - помните, что в конце все это просто IL).
Использовать Microsoft.VisualBasic.FileIO.TextFieldParser
Класс для разбора файла CSV Вот пример кода:
Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv")
parser.TextFieldType = FieldType.Delimited
parser.SetDelimiters(",")
While Not parser.EndOfData
'Processing row
Dim fields() As String = parser.ReadFields
For Each field As String In fields
'TODO: Process field
Next
parser.Close()
End While
Вот небольшой изящный обходной путь:
Вместо этого вы можете использовать греческий нижний цифровой знак (U+0375)
Похоже, это ͵
Использование этого метода также экономит много ресурсов...
Я знаю, что это почти 13 лет спустя, но мы столкнулись с похожей ситуацией, когда клиент вводит нам CSV и имеет значения с запятыми, есть 2 варианта использования:
- Если клиент использует клиент Windows Excel для записи CSV (обычно это имеет место в среде Windows), то запятые автоматически добавляются к значению.
Фактическое текстовое значение CSV:
3786962,1st Meridian Care Services,John,"Person A,Person B, Person C, Person D",Voyager
- Если клиент отправляет вам Excel программно, он должен придерживаться RFC4180 и заключать значение в «кавычки» . пример:
Кол1, Кол2,
"a, b, c"
, Кол4
Если вы хотите заново изобрести колесо, вам может помочь следующее:
public static IEnumerable<string> SplitCSV(string line)
{
var s = new StringBuilder();
bool escaped = false, inQuotes = false;
foreach (char c in line)
{
if (c == ',' && !inQuotes)
{
yield return s.ToString();
s.Clear();
}
else if (c == '\\' && !escaped)
{
escaped = true;
}
else if (c == '"' && !escaped)
{
inQuotes = !inQuotes;
}
else
{
escaped = false;
s.Append(c);
}
}
yield return s.ToString();
}
Если вы заинтересованы в более образовательном упражнении о том, как анализировать файлы в целом (на примере CSV), вы можете прочитать эту статью Джулиана Бакнолла. Мне нравится статья, потому что она разбивает вещи на гораздо более мелкие проблемы, которые гораздо менее непреодолимы. Сначала вы создаете грамматику, и когда у вас есть хорошая грамматика, преобразование грамматики в код является относительно простым и методичным процессом.
Статья использует C# и имеет ссылку внизу для загрузки кода.
Просто используйте SoftCircuits.CsvParser в NuGet. Он обработает все эти детали за вас и эффективно обрабатывает очень большие файлы. И, при необходимости, он может даже импортировать / экспортировать объекты, сопоставляя столбцы со свойствами объекта. Кроме того, мое тестирование показало, что он в среднем почти в 4 раза быстрее, чем популярный CsvHelper.
Я использовал библиотеку papaParse, чтобы проанализировать файл CSV и получить пары ключ-значение (ключ / заголовок / первая строка значения файла CSV).
Вот пример, который я использую:
https://codesandbox.io/embed/llqmrp96pm
там есть файл dummy.csv для демонстрации разбора CSV.
Я использовал его в ReactionJS, хотя его легко воспроизвести в приложении, написанном на любом языке.
Я использовал библиотеку Csvreader, но с ее помощью я получил данные, взорвавшись от запятой (,) в значении столбца.
Поэтому, если вы хотите вставить данные файла CSV, которые содержат запятую (,) в большинстве значений столбцов, вы можете использовать функцию ниже. Ссылка на автора => https://gist.github.com/jaywilliams/385876
function csv_to_array($filename='', $delimiter=',')
{
if(!file_exists($filename) || !is_readable($filename))
return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
{
if(!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
Поскольку это касается общих практик, давайте начнем с правил большого пальца:
Не используйте CSV, используйте XML с библиотекой для чтения и записи XML-файла.
Если вы должны использовать CSV. Сделайте это правильно и используйте бесплатную библиотеку для анализа и хранения файлов CSV.
Для обоснования 1) большинство синтаксических анализаторов CSV не поддерживают кодирование, поэтому, если вы не имеете дело с US-ASCII, у вас возникнут проблемы. Например, Excel 2002 хранит CSV в локальной кодировке без каких-либо замечаний о кодировке. Стандарт CSV не получил широкого распространения:(. С другой стороны, стандарт XML хорошо принят и хорошо обрабатывает кодировки.
Чтобы оправдать 2), существует множество синтаксических анализаторов csv для почти всех языков, поэтому нет необходимости изобретать колесо, даже если решения выглядят довольно просто.
Чтобы назвать несколько:
для Python использовать встроенный модуль CSV
для проверки perl CPAN и Text::CSV
для PHP используйте встроенные функции fgetcsv/fputcsv
для проверки библиотеки Java SuperCVS
На самом деле нет необходимости реализовывать это вручную, если вы не собираетесь анализировать это на встроенном устройстве.
Пример может помочь показать, как запятые могут отображаться в файле.csv. Создайте простой текстовый файл следующим образом:
Сохраните этот текстовый файл как текстовый файл с расширением ".csv" и откройте его в Excel 2000 из Windows 10.
aa, bb, cc, d; d "В представлении электронной таблицы нижняя строка должна выглядеть как указанная выше, за исключением того, что ниже отображается запятая вместо точки с запятой между d." aa,bb,cc,"d,d", работает даже в Excel
aa, bb, cc, "d, d". Это работает даже в Excel 2000 aa, bb, cc, "d, d". Это работает даже в Excel 2000 aa, bb, cc, "d, d". Это работает даже в Excel 2000
aa, bb, cc, "d, d". Ошибка в Excel 2000 из-за пробела ниже 1-й цитаты aa, bb, cc, "d, d". Ошибка в Excel 2000 из-за пробела ниже 1-й цитаты aa, bb, cc, "d, d". Это не удается в Excel 2000 из-за пробела ниже 1-й цитаты
aa, bb, cc, "d, d". Это работает даже в Excel 2000, даже с пробелами до и после второй кавычки. aa, bb, cc, "d, d". Это работает даже в Excel 2000, даже с пробелами до и после второй кавычки. aa, bb, cc, "d, d". Это работает даже в Excel 2000, даже с пробелами до и после второй кавычки.
Правило: если вы хотите отображать запятую в ячейке (поле) файла.csv: "Начинайте и заканчивайте поле двойными кавычками, но избегайте пробелов перед первой кавычкой"
Я обычно делаю это в моих процедурах разбора CSV-файлов. Предположим, что переменная 'line' - это одна строка в файле CSV, а все значения столбцов заключены в двойные кавычки. После выполнения двух приведенных ниже строк вы получите столбцы CSV в коллекции 'values'.
// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
string trimmedLine = line.Trim(new char[] { '\"' });
List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();
Самое простое решение, которое я нашел, это то, которое использует LibreOffice:
- Заменить все буквально
"
от”
- Положите двойные кавычки вокруг вашей строки
Вы также можете использовать тот, который использует Excel:
- Заменить все буквально
"
от""
- Положите двойные кавычки вокруг вашей строки
Обратите внимание, что другие люди рекомендовали сделать только шаг 2 выше, но это не работает со строками, где "
сопровождается ,
как в CSV, где вы хотите иметь один столбец со строкой hello",world
, как CSV будет читать:
"hello",world"
Который интерпретируется как строка с двумя столбцами: hello
а также world"
public static IEnumerable<string> LineSplitter(this string line, char
separator, char skip = '"')
{
var fieldStart = 0;
for (var i = 0; i < line.Length; i++)
{
if (line[i] == separator)
{
yield return line.Substring(fieldStart, i - fieldStart);
fieldStart = i + 1;
}
else if (i == line.Length - 1)
{
yield return line.Substring(fieldStart, i - fieldStart + 1);
fieldStart = i + 1;
}
if (line[i] == '"')
for (i++; i < line.Length && line[i] != skip; i++) { }
}
if (line[line.Length - 1] == separator)
{
yield return string.Empty;
}
}
Я обычно URL-кодирую поля, которые могут иметь запятые или специальные символы. А затем декодируйте его, когда он используется / отображается на любом визуальном носителе.
(запятые становятся%2C)
У каждого языка должны быть методы для URL-кодирования и декодирования строк.
например, в Java
URLEncoder.encode(myString,"UTF-8"); //to encode
URLDecoder.decode(myEncodedstring, "UTF-8"); //to decode
Я знаю, что это очень общее решение, и оно не может быть идеальным для ситуации, когда пользователь хочет просмотреть содержимое CSV-файла вручную.
Вы можете прочитать CSV-файл, как это.
это использует расколы и заботится о пробелах.
ArrayList List = new ArrayList();
static ServerSocket Server;
static Socket socket;
static ArrayList<Object> list = new ArrayList<Object>();
public static void ReadFromXcel() throws FileNotFoundException
{
File f = new File("Book.csv");
Scanner in = new Scanner(f);
int count =0;
String[] date;
String[] name;
String[] Temp = new String[10];
String[] Temp2 = new String[10];
String[] numbers;
ArrayList<String[]> List = new ArrayList<String[]>();
HashMap m = new HashMap();
in.nextLine();
date = in.nextLine().split(",");
name = in.nextLine().split(",");
numbers = in.nextLine().split(",");
while(in.hasNext())
{
String[] one = in.nextLine().split(",");
List.add(one);
}
int xount = 0;
//Making sure the lines don't start with a blank
for(int y = 0; y<= date.length-1; y++)
{
if(!date[y].equals(""))
{
Temp[xount] = date[y];
Temp2[xount] = name[y];
xount++;
}
}
date = Temp;
name =Temp2;
int counter = 0;
while(counter < List.size())
{
String[] list = List.get(counter);
String sNo = list[0];
String Surname = list[1];
String Name = list[2];
for(int x = 3; x < list.length; x++)
{
m.put(numbers[x], list[x]);
}
Object newOne = new newOne(sNo, Name, Surname, m, false);
StudentList.add(s);
System.out.println(s.sNo);
counter++;
}
Во-первых, давайте спросим себя: "Почему мы чувствуем необходимость обрабатывать запятые по-разному для файлов CSV?"
Для меня ответ таков: "Потому что, когда я экспортирую данные в файл CSV, запятые в поле исчезают, и мое поле разделяется на несколько полей, где запятые появляются в исходных данных". (Это потому, что запятая является символом-разделителем полей CSV.)
В зависимости от вашей ситуации, точки с запятой также могут использоваться в качестве разделителей полей CSV.
Учитывая мои требования, я могу использовать символ, например, одинарную кавычку, которая выглядит как запятая.
Итак, вот как вы можете сделать это в Go:
// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
s := fmt.Sprint(a)
s = strings.Replace(s, ",", "‚", -1)
s = strings.Replace(s, ";", "‚", -1)
return s
}
Второй символ с запятой в функции замены - десятичное 8218.
Имейте в виду, что если у вас есть клиенты, которые могут иметь программы чтения текста только для ascii, этот символ decima 8218 не будет выглядеть как запятая. Если это ваш случай, я бы рекомендовал окружить поле запятой (или точкой с запятой) двойными кавычками в соответствии с RFC 4128: https://tools.ietf.org/html/rfc4180
Спасибо другим в этом посте.
Я использовал информацию здесь, чтобы создать функцию в JavaScript, которая будет получать вывод csv для массива объектов, которые могут иметь значения свойств, содержащие запятые.
нравиться
rowsArray = [{obj1prop1: "foo", obj1prop2: "bar,baz"}, {obj2prop1: "qux", obj2prop2: "quux,corge,thud"}]
в
csvRowsArray = [{obj1prop1: "foo", obj1prop2: "\"bar,baz\""}, {...} ]
Чтобы использовать запятые в значениях в csv, значение необходимо заключить в двойные кавычки. А чтобы в json объекте в значении были двойные кавычки, их просто нужно экранировать, т.е.\"
, обратная косая черта, двойная кавычка. Выход делается здесь путем подстановки литерала шаблона и включения необходимых кавычек.`"${row[key]}"`
. Кавычки экранируются при помещении объекта.
Вот моя функция:
const calculateTheCSVExport = (props) => {
if (props.rows === undefined) return;
let jsonRowsArray = props.rows;
// console.log(jsonRowsArray);
let csvRowsArrayNoCommasInObjectValues = [];
let csvCurrRowObject = {}
jsonRowsArray.forEach(row => {
Object.keys(row).forEach(key => {
// console.log(key, row[key])
if (row[key].indexOf(',') > -1) {
csvCurrRowObject = {...csvCurrRowObject, [key]: `"${row[key]}"`} // enclose value in escaped double quotes in JSON in order to export commas to csv correctly. see more: https://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file
} else {
csvCurrRowObject = {...csvCurrRowObject, [key]: row[key]}
}
});
csvRowsArrayNoCommasInObjectValues.push(csvCurrRowObject);
csvCurrRowObject = {};
})
// console.log(csvRowsArrayNoCommasInObjectValues)
return csvRowsArrayNoCommasInObjectValues;
}
Я думаю, что самое простое решение этой проблемы - заставить клиента открыть CSV в Excel, а затем Ctrl + R, чтобы заменить все запятые на любой идентификатор, который вы хотите. Это очень просто для клиента и требует только одного изменения в вашем коде, чтобы прочитать выбранный вами разделитель.