Я использую немного ванильного скрипта 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)
Так что вариант а) очень медленный, а вариант б) портит разделитель строк (даже если он намного быстрее)
Буду признателен за любые рекомендации иизвиняюсь, если этот вопрос плохо поставлен.