Конечно можно использовать и вариант через ADO //infostart.ru/public/98398/
Например используя Schema.ini для Microsoft.ACE.OLEDB.12.0 http://it-proposition.blogspot.ru/2011/08/schemaini-microsoftaceoledb120.html
Но данный вариант кроссплатформенный.
Функция ИзСтрокиСРазделителями(S,Delimiter=",",QuoteChar="""") Экспорт
перем aList;
ExtractFields(S,aList,Delimiter,QuoteChar);
Возврат aList
КонецФункции
Функция НайтиВПодстроке(Стр1,Поз1,ИскомыйСимвол)
Стр=Сред(Стр1,поз1);
поз=Найти(Стр,ИскомыйСимвол);
Если поз=0 Тогда
возврат СтрДлина(стр1)+1
КонецЕсли;
Возврат поз1+поз-1
КонецФункции
Процедура ExtractFields(S,aList,Delimiter,QuoteChar)
FieldStart=0; ScanField=1; ScanQuoted=2; EndQuoted=3;
//{initialize by clearing the string list, and
// starting in FieldStart state}
// Assert(aList <> nil, 'TDExtractFields: list is nil');
aList= новый Массив;
if ( (S=неопределено) или (СтрДлина(S) =0 )) Тогда
aList.Add("");
return;
КонецЕсли;
State = FieldStart;
// RStringBuilder SB= new RStringBuilder();
SB="";
StartPos=1;
EndPos=СтрДлина(S);
Inx=1;
// {read through all the characters in the string}
while (Inx <=EndPos) Цикл
// {get the next character}
Ch = Сред(S,Inx,1);
// {switch processing on the state}
Если State =FieldStart Тогда
if ( Ch = QuoteChar) Тогда
State = ScanQuoted;
StartPos=Inx+1;
SB="";
Inx=НайтиВПодстроке(S,StartPos,QuoteChar);
продолжить;
else
if ( Ch = Delimiter) Тогда
aList.Add("");
else
State = ScanField;
StartPos=Inx;
Inx=НайтиВПодстроке(S,StartPos,Delimiter);
продолжить
КонецЕсли;
КонецЕсли;
ИначеЕсли State =ScanField Тогда
if ( Ch = Delimiter ) Тогда
CopyCount=Inx-StartPos;
aList.Add(Сред(S,StartPos,CopyCount));
State = FieldStart;
КонецЕсли
ИначеЕсли State = ScanQuoted Тогда
if ( Ch = QuoteChar) Тогда
State = EndQuoted;
CopyCount=Inx-StartPos;
// SB.Append(S,StartPos,CopyCount);
SB=SB+Сред(S,StartPos,CopyCount);
КонецЕсли;
ИначеЕсли State = EndQuoted Тогда
if (Ch = Delimiter) Тогда
aList.Add(SB);
State = FieldStart;
ИначеЕсли (Ch = QuoteChar) Тогда
State = ScanQuoted;
SB=SB+QuoteChar;
StartPos=Inx+1;
Inx=НайтиВПодстроке(S,StartPos,QuoteChar);
продолжить
else
ВызватьИсключение("Нет "+Delimiter+ "в позиции ="+Inx );
КонецЕсли;
КонецЕсли;
Inx=Inx+1;
КонецЦикла;
// {if we are in the ScanQUoted or GotError state at the end
// of the string, there was a problem with a closing quote}
if (State = ScanQuoted) Тогда
ВызватьИсключение("Нет закрывающей скобки от поз="+Строка(StartPos-1)+
" до конца строки");
КонецЕсли;
// {if the current field is not empty, add it to the list}
if (State = EndQuoted) Тогда
aList.Add(SB);
ИначеЕсли (State = ScanField) Тогда
CopyCount=Inx-StartPos;
aList.Add(Сред(S,StartPos,CopyCount));
КонецЕсли
КонецПроцедуры
И пример использования
Текст=Новый ЧтениеТекста(Файл,"windows-1251");
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
МассивЗначений=ИзСтрокиСРазделителями(Стр,РазделительПолей,ОграничительСтрок);
КонецЦикла
Например, разбирает строку:
435,"7689900--"",,,369"
где Delimiter="," и QuoteChar=""""
Ссылка на формат CSV:
https://ru.wikipedia.org/wiki/CSV
Ну и C# вариант, с которого писался данный вариант: