Имя: Пароль:
1C
1С v8
1c подключение к csv
0 Noxvil
 
30.10.12
15:08
Добрый день, коллеги.

Есть обработка которая в делает следующее:

1) Подключается к sftp серверу
2) Получает таблицу csv, копирует её в темп
3) Получает из неё таблицу значений
4) Загружает данные

на текущий момент необходимо следующее:

Подключиться к таблице csv и не заливая её на пк клиента - отфильтровать и сделать таблицу значений.

Вопросы:

Можно ли подключиться на sftp сервер сразу к файлу в режиме чтения?
Мы обрабатываем csv через текстовый документ, есть более простые и(или) быстрые методы сделать из csv таблицу значений?
1 Noxvil
 
30.10.12
15:09
И, что важно - отфильтрованной сразу...
2 mikecool
 
30.10.12
15:11
если сервер сможет такое выдать - то легко, если нет - тянуть файл и обрабатывать на месте
3 Defender aka LINN
 
30.10.12
15:12
Через ADO. Но "не заливая её на пк клиента" не выйдет никак, хоть ты тресни. Так или иначе будет качаться.
Что мешает в темп сохранить, прочитать и выпилить?
4 Noxvil
 
30.10.12
15:12
(2) Что значит "сервер сможет выдать" ?
5 Torquader
 
30.10.12
15:13
FTP-сервер выдаёт файл в порт или весь или его часть.
То есть вам нужно просто открыть порт на чтение и прочитать файл в память, обрабатывая его.
6 Noxvil
 
30.10.12
15:13
(3) Хочется ускорить процесс... Файл весит 20 мегов, качать его через инет...
7 mikecool
 
30.10.12
15:13
(4) отправил запрос на сервер - получил ответ, то и значит
8 le_
 
30.10.12
15:15
(6) Все 20 метров по-любому будут качаться.
Через ёксель можно легко сделать из csv таблицу ёксель.
9 Noxvil
 
30.10.12
15:17
(7) Такого нет
10 Defender aka LINN
 
30.10.12
15:17
(6) Он у тебя один фиг скачается. Так что кидай во временные, читай через ADO и удаляй после этого
11 oleg_km
 
30.10.12
15:18
(6) FTP-сервер не занет таких команд как преобразовать csv-файл в таблицу значений 1С. Почитай описание команд FTP-сервера
OFF: такая длиная цветная палочка
12 Noxvil
 
30.10.12
15:19
Через ADO - быстрее всего?
13 Noxvil
 
30.10.12
15:20
(11) да это понятно...
Я имел ввиду - просто получить файл в режиме чтения не закачивая.
14 Umka2008
 
30.10.12
15:20
НЕ ВЫЙДЕТ
15 ДенисЧ
 
30.10.12
15:22
А обязательно фтп? Может, тут webdav поможет?
16 AlexNecro
 
30.10.12
15:22
а если на сервере сохранять файл сразу в нужном формате, а не как попало?
17 AlexNecro
 
30.10.12
15:23
а сжатие?
18 oleg_km
 
30.10.12
15:23
(12) Лучше все сравнить экспериментально. Т.к. все зависит от данных, в каких-то случаях быстрее АДО, в каких-то чтениеТекста. Даже если АДО быстрее, разницу съест перемещение из рекордсета в ТЗ. Разве что отбор можно сделать SELECT'ом

(13) в случае FTP получить файл = закачать
19 Noxvil
 
30.10.12
15:28
Ок, спасибо - попробую.
20 Noxvil
 
07.11.12
16:29
Не подскажите, почему все колонки кроме первой пустые получаются?

вот текст:

"Раз";"Раз";"Раз"
"Раз";"Раз";"Раз"

КолПолей = 3;

ДатаНач = ТекущаяДата();

Папка = Параметры.Папка;
ИмяФайла = Параметры.ИмяФайла;
КолПолей = 3;

Текст = "[" + ИмяФайла + "]

|ColNameHeader=false

|Format=Delimited(;)

|TextDelimiter=none

|CharacterSet=ANSI

|";


Текст = Текст + "Col" + 1 + "=Field" + 1 + " text" + Символы.ПС;    
Текст = Текст + "Col" + 2 + "=Field" + 2 + " text" + Символы.ПС;    
Текст = Текст + "Col" + 3 + "=Field" + 3 + " text" + Символы.ПС;    

Сообщить(Текст);

ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.УстановитьТекст(Текст);
ТекстДок.Записать(Папка + "Schema.ini");


objRec = Новый COMОбъект("ADODB.Recordset");

strQuery = "SELECT * FROM [" + ИмяФайла + "]";
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Папка + ";Extended Properties=""text;""";
adOpenStatic = 3;
adLockOptimistic = 3;
adCmdText = 1;

ТаблЗнач = Новый ТаблицаЗначений;
Для ы = 1 По КолПолей Цикл    
   ТаблЗнач.Колонки.Добавить();    
КонецЦикла;

objRec.Open(strQuery, strConn, adOpenStatic, adLockOptimistic, adCmdText);
КолСтрок = objRec.RecordCount;

Ном = 1;

Пока Не objRec.EOF Цикл
   
   Если Ном % 500 = 0 Тогда
       
       Состояние(ИмяФайла + " " + Ном + " из " + КолСтрок);
       
   КонецЕсли;
   
   НовСтр = ТаблЗнач.Добавить();
   
   Для i=0 По objRec.Fields.Count-1 Цикл
       
       НовСтр[i] = Строка(objRec.Fields(i).Value);
       
   КонецЦикла;
   
   objRec.MoveNext();
   
   Ном = Ном + 1;
   
КонецЦикла;

objRec.Close();

Сообщить(ТекущаяДата()-ДатаНач);
21 Defender aka LINN
 
07.11.12
16:36
TextDelimiter=none - не?
22 Noxvil
 
07.11.12
16:40
Там так и есть, а что должно быть?
23 Noxvil
 
07.11.12
16:42
Делал по первому примеру: http://infostart.ru/public/98398/
24 Noxvil
 
07.11.12
16:49
коллеги, нет мыслей на тему? Уже час бьюсь.... (
25 Noxvil
 
07.11.12
17:06
Проблема ещё актуальна.
26 Noxvil
 
07.11.12
17:12
Блин, там же в форуме был ответ...
27 Fragster
 
гуру
07.11.12
17:14
нарисовать морду на php к этому файлу
28 Fragster
 
гуру
07.11.12
17:14
(27)+ расположенную на том же сервере...
29 Serginio1
 
07.11.12
17:18
30 Fragster
 
гуру
07.11.12
17:32
(29) ну и говнокодище
31 Fragster
 
гуру
07.11.12
17:33
с уже готовым csv хорошо работает ADO, если его долго качать - то только сокращать количество качаемых данных через фильтры на стороне сервера - а это в любом случае морда на сервере
32 Jaffar
 
07.11.12
17:37
zip уже предлагали?
33 Serginio1
 
07.11.12
18:05
(30) И чем тебе код не нравится? Обычный автомат, переписанный.
Ну здесь ты не зависишь от ADO
34 Fragster
 
гуру
07.11.12
18:07
(33) не нравится тем, что от него кровь из глаз идет.
35 Serginio1
 
07.11.12
18:14
(34) А это от того, что ты с автоматами не работал. Или тебе все пояснять надо? От регулярных выражение поначалу реки крови текут.
36 Fragster
 
гуру
07.11.12
18:15
а вообще - регулярка \".+\"|[^,]+ разве не разрубит на правильные куски строку?
37 Fragster
 
гуру
07.11.12
18:16
(35) я со всем работал. все понимаю. но от смешения языкаов типа  "if ... тогда", не нужных пробелов строк, неправильных отступов - течет кровь из глаз.
38 Fragster
 
гуру
07.11.12
18:22
(36) не все случаи отрабатывает, но можно раскрутить до правильных случаев
39 Fragster
 
гуру
07.11.12
18:22
вернее до правильной обработки всех случаев
40 Serginio1
 
07.11.12
18:41
(36) Для примера напиши разбор такой строки
","""",""",10

Здесь всего два элемента
,"","
10
41 Serginio1
 
07.11.12
18:44
(37) Это перепись с C# и адаптация к 1С
42 Serginio1
 
07.11.12
18:44
41 А вообще первоначально это код на Delphi Бакнелла
43 Ахиллес
 
07.11.12
18:52
(0) Поднять на сервере MySQL, закачать файл в неё и тянуть уже из MySQL запросом?
44 Fragster
 
гуру
07.11.12
18:55
(40) вот такое вроде работает:

(\"([^"]|\"{2,2})*\")|[^,]+


проверял с помощью http://infostart.ru/public/75941/
45 Fragster
 
гуру
07.11.12
18:56
(44)+ у результата, естественно, заменить "" на "
46 Serginio1
 
07.11.12
19:10
(45) пробовал http://regexpres.narod.ru/calculator.html
Ну да ладно. Знаю, что регулярные выражения не все автоматы описывают, но они становятся все мощнее.

",22"""",""",10 не отрабатывает
Должно быть
,22"","
10
47 Fragster
 
гуру
07.11.12
19:32
(46) обработка с инфостарта пилит правильно
48 Fragster
 
гуру
07.11.12
19:33
(47) опять же учитывая необходимость удаления экранов " и ""
49 Fragster
 
гуру
07.11.12
19:38
да и сайт тоже нормально ищет, просто там надо пробелы удалить сначала и конца, а также поставить "глобальный" поиск. видно, что по "replace" остается только одна запятая - это как раз разделитель.
50 sttt
 
07.11.12
19:59
что мешает обработать этот csv на сервере и отдать нужное?
как вариант на php:
date_default_timezone_set('Europe/Berlin');    
$pattern = sprintf('#%s.*|%s.*#', date('d/m/Y'),
                                 date('d/m/Y', strtotime("+1 day")) );
$file = file_get_contents('filename.csv');
preg_match_all($pattern, $file, $matches);
var_dump($matches);
51 Serginio1
 
08.11.12
10:39
(48) Ну вот видишь экраны нужно убирать. Так или иначе все равно на регах строится  КА . В свое время опять же Бакнеловские примеры переделывал с таблицей переходов создавая НКА.