Каталог решений - ИзСтрокиСРазделителями в Восьмерке

ИзСтрокиСРазделителями в Восьмерке

ИзСтрокиСРазделителями в Восьмерке

В наличии

Очень часто приходится работать с данными клиентов которые присылают данные в разных форматах в том числе и CSV.
Это аналог семерочной функции ИзСтрокиСРазделителями

Категория:

Описание

Конечно можно использовать и вариант через ADO  //sale.itcity.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# вариант, с которого писался данный вариант:

http://rsdn.ru/forum/dotnet/3303143.1

has been added to your cart:
Оформление заказа