Имя: Пароль:
1C
1С v8
Преобразование csv в таблицу значений, продолжение
0 SuperMario
 
15.07.11
13:38
Всем доброго дня!
Возникла необходимость загружать данные из csv файла данные. Воспользовался Microsoft Text Driver (*.txt; *.csv) для решения данной задачи.

Книга знаний: Преобразование csv в таблицу значений

Но есть косяк. При обработке результата запроса некоторые поля возвращаются пустыми. Это возникает потому, что драйвер пытается преобразовать строку в число. Если успех, что значение есть. Если нет, то нет. Ест-но если поле "код" содержит символы, то значение пустое, а нужен именно код как он есть.

Как побороть?
1 Serginio1
 
15.07.11
13:50
Использую данный вариант

Функция ИзСтрокиСРазделителями(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));
   КонецЕсли
КонецПроцедуры
2 Рэйв
 
15.07.11
13:54
(0)А к чему это извращенское смешание латинского и русского написания?
3 SuperMario
 
15.07.11
13:57
(2) не понял вопроса.
4 Рэйв
 
15.07.11
13:57
(3)Просто интересно.
Где-то if гдето Если.
Это к чему?
5 Serginio1
 
15.07.11
14:02
(3) Это наверное мне.
(4) Переписывал с C# кода. Это доработанный v8: v8:ИзСтрокиСРазделителями