|
Преобразование 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:ИзСтрокиСРазделителями |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |