И правильно учитываются экранированные разделители?
.csv от Microsoft программ друг друга не понимают. Сохраняешь как "csv разделитель запятые", на выходе - разделитель точка с запятой.
Перенос строк CRLF. Перенос строк внутри ячейки просто LF
Я парсю текст с браузера. Разделителем текста в строке (для дальнейшей разбивки на столбцы в Excel) служит не ";" а "|". Хотя бы потому, что в моём тексте точка с запятой встречаются, да и в плане наглядности "|" намного лучший разделитель...
Дальше с текстом работаю в Excel исключительно с помощью "горячих" клавиш... Как пример, разделить текст:
excel:
//------------------------- Закрыть окна Clickermann и Cyberfox ----------------
WNDSTATE(WNDFIND("Редактор - C:\Clickermann\"), 0)
WAITMS(300)
WNDSTATE(WNDFIND("Cyberfox"), 0)
WAITMS(300)
//========================= ОБРАБОТКА ТЕКСТА В EXCEL ===========================
//------------------------- Открыть файл. Расширить окно. Назначить язык En -----
EXECUTE("input.csv")
WAIT(1)
WNDSETINFO(WNDFIND("input.csv - Excel"), 0, 0, 1440, 862)
WAIT(1)
SETKBLAYOUT(WNDFIND("input.csv - Excel"), 1033)
WAIT(1)
//------------------------- Вкладка Данные. Текст по столбцам ------------------
// выделить столбец до конца вниз
KEYDOWN(#CTRL)
WAITMS(50)
KEYDOWN(#SHIFT)
WAITMS(100)
KEYPRESS(#DOWN)
KEYUP(#SHIFT)
KEYUP(#CTRL)
WAIT(1)
// выбрать из закладки данные текст по столбцам
KEYDOWN(#ALT)
WAITMS(50)
KEYPRESS(192)
KEYUP(#ALT)
WAIT(1)
KEYPRESS(#9)
WAIT(1)
SETKBLAYOUT(WNDFIND("input.csv - Excel"), 1049)
WAIT(1)
KEYPRESS(#H)
WAITMS(300)
KEYPRESS(#TAB)
WAITMS(200)
KEYPRESS(#TAB)
WAITMS(300)
KEYPRESS(#ENTER)
WAIT(1)
KEYPRESS(#L)
WAITMS(500)
SETKBLAYOUT(WNDFIND("input.csv - Excel"), 1033)
WAIT(1)
KEYDOWN(#SHIFT)
WAITMS(50)
KEYPRESS(220)
KEYUP(#SHIFT)
WAIT(1)
KEYPRESS(#ENTER)
WAITMS(500)
KEYPRESS(#ENTER)
WAIT(1)
//------------------------- Перейти на стиль ссылок R1C1
KEYPRESS(#ALT)
WAIT(1)
KEYPRESS(65)
WAITMS(500)
KEYPRESS(#V)
WAIT(1)
KEYPRESS(#DOWN)
WAITMS(500)
KEYPRESS(#TAB)
WAITMS(300)
KEYPRESS(#1)
WAITMS(500)
KEYPRESS(#ENTER)
WAIT(1)
Ну понятно, что это всего лишь часть кода, весь код больше 500 строк... и в основном это конечно работа в Excel. Я перевёл решение всех однотипных нудных повторяющихся заданий на Автокликер, а дальше уже максимально обработанный файл всё равно приходится проверять.
Задержки большие, согласен, но при меньших может что-то не срабатывать, поэтому для себя дешевле посидеть лишнюю минуту и подождать, чем потом вылавливать косяки... (((
У меня это работает на Win 8.1 + Microsoft Office 2016.
Да... разделяю данные "|" перед записью в файл:
$str = TFCOUNT("in.txt")
//------------------------- записать данные ---------------------------------
$txt = "|"
IF($str > 0)
$i = 0
FOR($n = 0, $n < $str)
IF(STRLEN(STRREADLN("in.txt", 1)) > 2)
$arr[$n] = STRREADLN("in.txt", 1)
WAITMS(100)
$txt = STRCONCAT($txt, $arr[$n], "|")
WAITMS(100)
END_IF
ELSE
$n = $n - 1
END_IF
TFDelete("in.txt", 1)
WAITMS(100)
INC($i)
IF($i = $str)
$n = $str
END_IF
END_CYC
UNDEFINE($arr)
END_IF
$txt = STRCONCAT($p, "|", $art, "|", $url, "|", $pho, $txt)
STRWRITELN("input.txt", $txt)
WAITMS(200)
STRWRITELN("input.csv", $txt)
WAITMS(200)
Смысл приведённого примера:
Данные вначале записываются в файл in.txt который обрабатывается под Ваши нужды и дальше становится уже чистовой строкой для записи в другой файл input.txt (in.txt очищается при каждой итерации), в котором таких строк уже много, они и разделяются в дальнейшем на столбцы с помощью разделителя "|".