Имя: Пароль:
1C
1C 7.7
v7: Чтение csv в 1С 7.7
0 cmex
 
28.03.13
12:56
Все доброго времени суток. Сабж. Разделитель полей: табуляция (0x09)
Разделитель строк: CR+LF (два символа: 0x0D 0x0A)
Кодировка: Windows-1251. Спасибо
1 ДенисЧ
 
28.03.13
12:57
На здоровье.
Рады, что поделился с нами мыслями.
2 cmex
 
28.03.13
12:57
(1) )) забыл дописать) как организовать это самое чтение?
3 palpetrovich
 
28.03.13
13:00
4 palpetrovich
 
28.03.13
13:01
+3 или так http://infostart.ru/public/98398/ с использованием АДО
5 cmex
 
28.03.13
13:05
(3) мне нужно для 7ки а там для 8ки,нет?
6 palpetrovich
 
28.03.13
13:06
так изабанили :)  ...ну по (4) сходи
7 cmex
 
28.03.13
13:08
(4) тоже для 8. я был по обеим ссылкам. или 4 это для 7?я просто с 7кой не работал, установлю ее токо через час( на работе дист ищут))
8 palpetrovich
 
28.03.13
13:18
(7) да, согласен, сам не смотрел :) ...ну ща поищу для тебя :))
9 FN
 
28.03.13
13:25
Примерно так

Текст=СоздатьОбъект("Текст");
       Текст.Открыть(СокрЛП(Файл));
       ЗагрузкаИзТекста(Текст);

Процедура ЗагрузкаИзТекста(Источник,Разделитель="")
   спРазделителей=СоздатьОбъект("СписокЗначений");
   Если ПустоеЗначение(Разделитель)=1 Тогда
       спРазделителей.ДобавитьЗначение(";");
       спРазделителей.ДобавитьЗначение(СимволТабуляции);
       спРазделителей.ДобавитьЗначение("|");
   Иначе
       спРазделителей.ДобавитьЗначение(Разделитель);
   КонецЕсли;
   текст=СоздатьОбъект("Текст");
   Строк=Источник.КоличествоСтрок();
   для х=1 по Строк Цикл
       ТекСтрока=Источник.ПолучитьСтроку(х);
       для ш=1 по спРазделителей.РазмерСписка() Цикл
           ТекСтрока=СтрЗаменить(ТекСтрока,спРазделителей.ПолучитьЗначение(ш),РазделительСтрок);
       КонецЦикла;
       текст.Очистить();
       текст.ДобавитьСтроку(ТекСтрока);
       ТЗ.НоваяСтрока();
       для ш=1 по текст.КоличествоСтрок() Цикл
           Если ш>ТЗ.КоличествоКолонок() Тогда
               ТЗ.НоваяКолонка();
               спШирина.ДобавитьЗначение(1);
           КонецЕсли;
           ТекЗнач=текст.ПолучитьСтроку(ш);
           ТЗ.УстановитьЗначение(х,ш,ТекЗнач);
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры


P.S. ТЗ - Таблица значений
Некорректно будет работать при наличии разделителей в данных заключенных в "" - но такие файлы редкость.
10 cmex
 
28.03.13
14:05
(8) спасибо.
(9) большое спасибо, щас попробую
11 palpetrovich
 
28.03.13
14:14
(10) отвлекают гады :) ..во, нарисовал:
Процедура Сформировать()
   ИмяФайла = "D:\filecsv.csv";
   ФайлИмпорта = СоздатьОбъект("Текст");
   ФайлИмпорта.КодоваяСтраница(0);  
   Разделитель = СимволТабуляции;
   Если ФС.СуществуетФайл(ИмяФайла)=0 Тогда  
       Сообщить("Не нашел файл");
       Возврат;
   КонецЕсли;
   ФайлИмпорта.Открыть(ИмяФайла);      
   // вычисляем максимальное число полей              
   ТекСтрока="";
   ЧислоПолей=1;
   Для НомерСтроки = 1 По ФайлИмпорта.КоличествоСтрок() Цикл
       Если ПустаяСтрока(ТекСтрока)>0 Тогда
           ТекСтрока = СокрЛП(ФайлИмпорта.ПолучитьСтроку(НомерСтроки));
       КонецЕсли;    
       ЧислоПолей = Макс(ЧислоПолей,СтрЧислоВхождений(СокрЛП(ФайлИмпорта.ПолучитьСтроку(НомерСтроки)),Разделитель));
   КонецЦикла;  
   ЧислоПолей = ЧислоПолей + 1;
   // выгрузим в ТЗ
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   Для колКолонок = 1 по ЧислоПолей цикл
       ТЗ.НоваяКолонка("Поле"+колКолонок);
   КонецЦикла;  
   Для НомерСтроки = 1 По ФайлИмпорта.КоличествоСтрок() Цикл
       ТекСтрока = СокрЛП(ФайлИмпорта.ПолучитьСтроку(НомерСтроки));
       ТЗ.НоваяСтрока();
       Для НомерПоля = 1 По ЧислоПолей Цикл
           ПозицияРазделителя = Найти(ТекСтрока,Разделитель);  
           Если ПозицияРазделителя=0 Тогда
               ПозицияРазделителя = СтрДлина(ТекСтрока) + 1;
           КонецЕсли;
           ЗначениеПоля = Лев(ТекСтрока,ПозицияРазделителя-1);
           ТекСтрока = Прав(ТекСтрока,СтрДлина(ТекСтрока)-ПозицияРазделителя);
           ТЗ.УстановитьЗначение(НомерСтроки,НомерПоля,ЗначениеПоля);
       КонецЦикла;                
   КонецЦикла;  
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
12 olegves
 
28.03.13
14:26
(0) v7plus.dll тебе в помощь
13 oslokot
 
28.03.13
14:31
хм, а я всегда программно пересохраняю в xls, далее работаю с ёкселем
       
фс.ПереименоватьФайл(ВыбФайл_csv,ВыбФайл_xls,1);
Ексель=СоздатьОбъект("Excel.Application");
Ексель.Displayalerts = 0;
Книга=Ексель.Workbooks.Open(Сокрлп(ВыбФайл_xls));
Книга.SaveAs(ВыбФайл_xls,-4143);
Книга.Close();
Ексель.Quit();
14 palpetrovich
 
28.03.13
14:33
(13) а из  xls можно еще и в дбф пересохранить ;)
15 FN
 
28.03.13
14:35
(14) а потом дбф загнать в sql и прямым запросом вытащить
:)

легких путей не ищем
16 oslokot
 
28.03.13
14:37
(15) это мне на мисте советовали :) я не знаю как с csv работать, ну его к черту )
17 oslokot
 
28.03.13
14:38
(14) кстати да, нада попробовать )
18 cmex
 
28.03.13
15:33
Всем спасибо. Все отлично работает. Попутно в 7 коде боле менее стало что то понятно)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший