CommaIO - предполагает наличие некоторой табличной структуры содержимого файла. Т.е. при его использовании предполагается, что строка файла - это одна "запись" таблицы, а внутри строки - набор "полей". Отсюда и ряд ограничений..
Что есть "строка", а что "поле" определяется по заранее указанным символам - ограничителям. По умолчанию, границей "строки" является символ перевода строки и (или) возврата каретки, а границей "поля" - запятая.
Как следствие, чтобы не возникало путаницы, символ перевода строки внутри "поля" необходимо на что-то заменить. Вот и происходит замена как символа "\n", так и символа "\r" на пробел.
И, хотя, символ "конец строки" есть настраиваемое значение, но на факт замены это не влиянет. Видимо, недоработка разработчиков.
Содержимое итогового файла - это всегда текст. Набор символов. Однако если для числовых данных никакой неоднозначности нет, то для всех прочих типов данных, в общем случае не всегда можно определить где начало, а где конец "поля". Ведь "поле" внутри себя может содержать символ-ограничитель "полей".
Поэтому, все не числовые "поля" в обязательном порядке обрамляется двойными кавычками. Это безусловное и не настриваемое ограничение.
Как следствие, если внутри "поля" есть двойная кавычка, то, чтобы отличить ее от символа, ограничивающего значение поля, происходит задвоение символа двойной кавычки.
Другими словами, все автозамены при работе с CommaIO взяты не "с потолка", а имеют вполне практический смысл, призванный, по возможности, уменьшить неоднозначность, при разбиении текстовго файла на "поля" и "строки".
AsciiIO - выводит информацию "как есть". Точнее, как текстовую информацию. "Гладкий" текст. Поэтому, по умолчанию, никаких автозамен и добавлений кавычек не происходит. Текст выводится "как есть". Только добавляются пробелы между "полями".
Однако, поскольку AsciiIO - наследник от CommaIO, то у него также можно настроить символы-ограничители полей и строк. Но AsciiIO проработан лучше чем CommaIO.
Если происходит настройка символа-ограничителя строк и содержимое одного из полей имеет внутри себя символ "\n", то произойдет автозамена этого символа на настроенный символ-ограничитель строк. В остальном, никаких автозамен AsciiIO не делает.
|