Игнорировать разделитель строк в текстовой строке CSV при использовании потока ADODB (Javascript) - PullRequest
0 голосов
/ 18 апреля 2019

Я использую немного ванильного скрипта ES3 старой школы, чтобы изменить кодировку CSV (которую я получаю из XML-ответа HTTP).Проблема, с которой я сталкиваюсь, состоит из двух частей.

a) Если я НЕ разбиваю CSV на отдельные строки, чтение текста занимает время LOOONNNNNGGGG с использованием ADODB (только с использованием .readtext).

b) Чтобы обойти а), я решил просто разделить CSV на разделитель строк (возврат каретки, 10) и прочитать его построчно в массив, и, хотя это работает быстро, к сожалению, CSV был как 'поле description, в котором пользователи иногда используют разделитель строк.Это непреднамеренно распознается как конец строки CSV, что приводит к довольно раздражающим / катастрофическим проблемам.

Мой простой код приведен ниже: Первая проблема: a)

var O = new ActiveXObject('ADODB.Stream');
O.Type = 2; 
O.Open;
O.Charset = 'ISO-8859-1';
O.WriteText (csvStr);
O.Position = 0;
O.Charset = 'UTF-8';

Это работает нормально и вв значительной степени доли секунды (хотя это CSV строки 35K).Теперь, если я хочу поместить его обратно в csvStr, я бы сделал

csvStr = O.ReadText

, но на это уходит много времени - это ожидалось или я что-то не так делаю?

Проблема b): Iпытаясь решить эту проблему, поместив его в 2D-массив, я разделил его на LineSeparator, а затем зациклил с помощью регулярного выражения, что, кажется, работает, но некоторые строки перепутались, потому что текст в поле описания, который пользователи вводили, может содержатьразделитель строк.

var O = new ActiveXObject('ADODB.Stream');
O.Type = 2; 
O.Open;
O.Charset = 'ISO-8859-1';

O.WriteText (csvStr);
O.Position = 0;
O.Charset = 'UTF-8';
O.LineSeparator = 10;
var A = new Array
do {A.push(csvStr.readText(-2).match(/""[^""]*""|[^,]+/g));} while(O.EOS == false)

Так что вариант а) очень медленный, а вариант б) портит разделитель строк (даже если он намного быстрее)

Буду признателен за любые рекомендации иизвиняюсь, если этот вопрос плохо поставлен.

...