Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/112: Рейтинг темы: голосов - 112, средняя оценка - 4.78
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
1

Обработка текстового документа в таблицу значений

02.06.2012, 16:57. Показов 21196. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Скажу сразу, опыта нету, поэтому вопросы могут звучать глупо. Учусь самостоятельно, но упорно.

Итак, идея такова:

Имеем текстовый файл (.txt), содержимое:
45;Московская 38
46;Кулибина 15

Первое значение это "Номер подразделения", второе "Адрес".
Необходимо сделать обработку загрузки этого файла в справочник "Места хранения".

На форме имеется поле ввода "ВыборФайла" и его обработчик:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
&НаКлиенте
Процедура ВыборФайлаОткрытие(Элемент, СтандартнаяОбработка)
 
        СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Текст = "ru = ""Текст""; en = ""Text""";
    Фильтр = НСтр(Текст)+"(*.txt)|*.txt";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            ВыбФайл = Новый Файл(ИмяФайла);
            Текст = "ru = ""; Размер = ""; en = ""; Size = """;
            Предупреждение(ИмяФайла+НСтр(Текст)+ВыбФайл.Размер());
        КонецЦикла;
    Иначе
        Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
        Предупреждение(НСтр(Текст));
    КонецЕсли;
        ВыборФайла = ИмяФайла;
КонецПроцедуры
Файл выбрал, теперь хочу считать его в таблицу значений "ТЗДанныеФайла" в которой 2 колонки "Номер подразделения" и "Адрес подразделения", чтобы посмотреть чего загрузилось и если что, то что-то поправить. И вот тут на меня напал ступор, я понимаю что нужно в цикле перебрать все строки и занести их в таблицу значений, но как это сделать и как заставить программу воспринять разделитель ";" за разделитель колонок, я не могу.

Хватило только на то чтобы это запустить в цикл:
1C
1
2
3
4
5
6
7
8
9
10
11
&НаКлиенте
Процедура ЗаполнитьТЗДанныеФайла(Команда, ВыборФайла)
 
    Текст = Новый ЧтениеТекста(Элементы.ВыборФайла.ТекстРедактирования);
    Стр = Текст.ПрочитатьСтроку();
    Пока Стр <> Неопределено Цикл
        Сообщить(Стр);
        Стр = Текст.ПрочитатьСтроку();
    КонецЦикла;
    
КонецПроцедуры
Знаю, что новичков не любят, но прошу помощи в реализации этого, по возможности как можно подробнее, хочу не просто решение задачи, но и понимание этого решения.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2012, 16:57
Ответы с готовыми решениями:

Чтение текстового документа, обработка, запись нового
Задача: есть текстовый документ типа: 36745 375294567456 80293455906 ... Нужно прочитать...

Обработка текстового документа с выводом данных в директорию
Добрый день, первый день на баше, пока изучаю Есть одна задачка : Например, в текстовом файле...

Как сделать в Deiphi внесение данных из текстового документа в таблицу?
Не могу сделать внесение данных в таблицу из текстового документа через батон. Что подскажите ?

Считывание пар чисел из текстового документа и подстановка значений в график функции
Здравствуйте, уважаемые форумчане! Столкнулся с проблемой, нужно написать программу для построения...

22
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
02.06.2012, 17:53 2
Итак, есть стр, в которой "0986345678;длордордордордор", так?
Нам нужно добавить строку в таблицу значений и занести в две колонки "Номер" и "Адрес", так?
Перед циклом создать ТЗ, в цикле добавлять строки и заполнять, разделяя по ";". Разделять строку просто: заменить разделитель на перевод строки и брать кусочки по индексу.
1C
1
2
3
4
5
6
7
8
9
10
11
12
Таб=Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Номер");
Таб.Колонки.Добавить("Адрес");
Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Пока Истина Цикл
Стр = Текст.ПрочитатьСтроку();
Если Стр=Неопределено Тогда Прервать;КонецЕсли;
СтрТаб=Таб.Добавить();
ПолиСтр=СтрЗаменить(стр,";",Символы.ПС);
СтрТаб.Номер=СтрПолучитьСтроку(ПолиСтр,1);
СтрТаб.Адрес=СтрПолучитьСтроку(ПолиСтр,2);
КонецЦикла;
1
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
02.06.2012, 19:15  [ТС] 3
Цитата Сообщение от duk337 Посмотреть сообщение
Итак, есть стр, в которой "0986345678;длордордордордор", так?
Нам нужно добавить строку в таблицу значений и занести в две колонки "Номер" и "Адрес", так?
Перед циклом создать ТЗ, в цикле добавлять строки и заполнять, разделяя по ";". Разделять строку просто: заменить разделитель на перевод строки и брать кусочки по индексу.
1C
1
2
3
4
5
6
7
8
9
10
11
12
Таб=Новый ТаблицаЗначений;
Таб.Колонки.Добавить("Номер");
Таб.Колонки.Добавить("Адрес");
Текст = Новый ЧтениеТекста("d:\win.txt", КодировкаТекста.ANSI);
Пока Истина Цикл
Стр = Текст.ПрочитатьСтроку();
Если Стр=Неопределено Тогда Прервать;КонецЕсли;
СтрТаб=Таб.Добавить();
ПолиСтр=СтрЗаменить(стр,";",Символы.ПС);
СтрТаб.Номер=СтрПолучитьСтроку(ПолиСтр,1);
СтрТаб.Адрес=СтрПолучитьСтроку(ПолиСтр,2);
КонецЦикла;
Насколько я понял создание таблицы значений должно происходить на сервере. Вызвать не проблема. Но, нужно в эту процедуру как-то передать путь к выбранному файлу в другой процедуре. То есть файл я забираю не из определенного места, а из выбранного мной места.
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
02.06.2012, 19:49 4
Есть такая возможность
1C
1
2
3
4
5
6
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогВыбораФайла.Заголовок = "файл я забираю из выбранного мной места";
    ДиалогВыбораФайла.Фильтр    = "Табличный документ (*.mxl)|*.mxl|Лист Excel (*.xls)|*.xls|Текстовый документ (*.txt)|*.txt|dBase III (*.dbf)|*.dbf|";
    Если ДиалогВыбораФайла.Выбрать() Тогда
    ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
    КонецЕсли;
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
02.06.2012, 21:43 5
Цитата Сообщение от Moshik Посмотреть сообщение
Но, нужно в эту процедуру как-то передать путь к выбранному файлу в другой процедуре. То есть файл я забираю не из определенного места, а из выбранного мной места.
Вам нужно передавать не путь к файлу а сам файл, т.к. сервер может(а скорее всего так и будет) находится не на вашем ПК.
Для передачи файла на клиенте используйте функцию ПоместитьФайл(), а на сервере ПолучитьИзВременногоХранилища(). Описание функций в синтаксис помощнике.
2
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 08:14  [ТС] 6
Цитата Сообщение от Fenomen Посмотреть сообщение
Вам нужно передавать не путь к файлу а сам файл, т.к. сервер может(а скорее всего так и будет) находится не на вашем ПК.
Для передачи файла на клиенте используйте функцию ПоместитьФайл(), а на сервере ПолучитьИзВременногоХранилища(). Описание функций в синтаксис помощнике.
Значит мое подозрение подтвердилось, нужно передать на сервер сам файл.

То есть я передаю его на сервер в процедуре выбора файла на клиенте, а обрабатываю в серверной процедуре? А как потом полученые значения передать на форму на клиенте? Пока возможности посмотреть синтаксис помощник нет, но думаю там все описано.


Забыл описать в первом посте, то как построена работа. Делаю все для себя, дабы набить руку и забить голову. Действие происходит на ноуте где стоит платформа, но БД находится на другом компе, на котором стоит SQL Server 2012 (Решил убить двух зайцев, посмотреть на новый SQL и разобрать клиент-серверный вариант работы).
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
03.06.2012, 11:20 7
Цитата Сообщение от Moshik Посмотреть сообщение
Значит мое подозрение подтвердилось, нужно передать на сервер сам файл.
Через хранилище (спасибо Fenomen)
Цитата Сообщение от Moshik Посмотреть сообщение
То есть я передаю его на сервер в процедуре выбора файла на клиенте, а обрабатываю в серверной процедуре? А как потом полученые значения передать на форму на клиенте?
Помещаете в хран. на клиенте, достаёте на сервере. Серверная процедура/функция вернёт в клиентскую то, что напишете, например структуру, массив, ТЗ или Результат запроса
Цитата Сообщение от Moshik Посмотреть сообщение
Пока возможности посмотреть синтаксис помощник нет, но думаю там все описано...на ноуте где стоит платформа
Странно: платформа стоит, синтпома нет. Джокер какой-то
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 11:32  [ТС] 8
Цитата Сообщение от duk337 Посмотреть сообщение
Странно: платформа стоит, синтпома нет. Джокер какой-то
Это было утром через Windows 8 с кофе стоя на балконе с сигареткой. Связка сервер + ноут с платформой были не запущены. Сейчас разбираюсь с Вашими советами.
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
03.06.2012, 12:08 9
Достаточно запустить 1cv8 в режиме конфиуратора, сославшись на пустой локальный каталог
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 12:13  [ТС] 10
Подскажите еще пожалуйста как мне получить или как явно задать имя временного хранилища?

В "ПоместитьФайл" параметр Имя является не обязательным, но если я его не укажу, то как получу файл на сервере в "ПолучитьИзВременногоХранилища", там адрес обязателен.

При указании в таком виде:
1C
1
ПоместитьФайл(123,ИмяФайла,,Ложь,);
Вылетает ошибка:
{Обработка.ИмпортНоменклатуры.Форма.Форма.Форма(20)}: Ошибка при вызове метода контекста (ПоместитьФайл)
ПоместитьФайл(123,ИмяФайла,,Ложь,);
по причине:
Ошибка сохранения файла. Возможно произошла ошибка блокировки базы или передан неправильный URL.
Как я должен программе дать понять что ей на клиенте надо положить файл в такое-то хранилище, а на сервере забрать из него файл?


Цитата Сообщение от duk337 Посмотреть сообщение
Достаточно запустить 1cv8 в режиме конфиуратора, сославшись на пустой локальный каталог
Там только Windows 8 свежеустановленная.
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
03.06.2012, 12:28 11
Есть предположение, что адрес система вернёт в параметр.
1C
1
2
ф="";
ПоместитьФайл(ф,ИмяФайла,,Ложь,);
Добавлено через 2 минуты
на сервере
1C
1
Нечто = ПолучитьИзВременногоХранилища(ф);
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 13:08  [ТС] 12
Цитата Сообщение от duk337 Посмотреть сообщение
Есть предположение, что адрес система вернёт в параметр.
1C
1
2
ф="";
ПоместитьФайл(ф,ИмяФайла,,Ложь,);
Добавлено через 2 минуты
на сервере
1C
1
Нечто = ПолучитьИзВременногоХранилища(ф);
Как-то сразу об этом не подумал, но вот на сервере переменной "ф" не существует и соответственно проверка синтаксиса говорит что переменная не определена.
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
03.06.2012, 13:19 13
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&НаКлиенте
Процедура ВыбратьФайл()
 
<Ваш код>
 
АдресВременногоХранилищаФайла = "";
ПоместитьФайл(АдресВременногоХранилищаФайла, ИмяФайла, , Ложь, );
 
ОбработатьнаСервере(АдресВременногоХранилищаФайла );
 
КонецПроцедуры
 
&НаСервере
Процедура ОбработатьНаСервере(АдресВременногоХранилищаФайла )
 
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла);
 
<Ваш код>
 
КонецПроцедуры
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 13:57  [ТС] 14
Цитата Сообщение от Fenomen Посмотреть сообщение
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&НаКлиенте
Процедура ВыбратьФайл()
 
<Ваш код>
 
АдресВременногоХранилищаФайла = "";
ПоместитьФайл(АдресВременногоХранилищаФайла, ИмяФайла, , Ложь, );
 
ОбработатьнаСервере(АдресВременногоХранилищаФайла );
 
КонецПроцедуры
 
&НаСервере
Процедура ОбработатьНаСервере(АдресВременногоХранилищаФайла )
 
ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(АдресВременногоХранилищаФайла);
 
<Ваш код>
 
КонецПроцедуры
Передать параметр получилось, но метод ПолучитьИзВременногоХранилища требует чтобы путь указан был как строка. Как я могу его ему передать как строку?
0
2955 / 1767 / 82
Регистрация: 03.11.2011
Сообщений: 8,280
03.06.2012, 14:01 15
ПоместитьФайл возвращает строку в первый параметр. А Вы что передавали?
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 17:06  [ТС] 16
Цитата Сообщение от duk337 Посмотреть сообщение
ПоместитьФайл возвращает строку в первый параметр. А Вы что передавали?
В серверной процедуре при вызове:
1C
1
Файл = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
Выдает ошибку:
Цитата Сообщение от
{Обработка.ИмпортНоменклатуры.Форма.Форма.Форма(51)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
Файл = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
по причине:
Недопустимое значение параметра (параметр номер '1')
Добавлено через 2 часа 15 минут
Что-то я в полном ступоре. Ниже привел модуль формы полностью, На данный момент намудрякал уже все что в голову пришло. Так что если и было правильно что-то, то после последних действий накосячил по полной.
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
&НаКлиенте
Процедура ВыборФайлаОткрытие(Элемент, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Текст = "ru = ""Текст""; en = ""Text""";
    Фильтр = НСтр(Текст)+"(*.txt)|*.txt";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            ВыбФайл = Новый Файл(ИмяФайла);
            Текст = "ru = ""; Размер = ""; en = ""; Size = """;
            Предупреждение(ИмяФайла+НСтр(Текст)+ВыбФайл.Размер());
        КонецЦикла;
    Иначе
        Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
        Предупреждение(НСтр(Текст));
    КонецЕсли;
        ВыборФайла = ИмяФайла;
        
        АдресВременногоХранилища = "";
        ПоместитьФайл(АдресВременногоХранилища,ИмяФайла,,Ложь,);
        ЗаполнитьТЗДанныеФайлаНаСервере(АдресВременногоХранилища);
КонецПроцедуры
 
&НаКлиенте
Процедура ЗаполнитьТЗДанныеФайла(Команда)
    
 
    ЗаполнитьТЗДанныеФайлаНаСервере();   
    
//
//  Текст = Новый ЧтениеТекста(Элементы.ВыборФайла.ТекстРедактирования);
//  Стр = Текст.ПрочитатьСтроку();
//  Пока Стр <> Неопределено Цикл
//      Сообщить(Стр);
//      Стр = Текст.ПрочитатьСтроку();
//  КонецЦикла;
//  
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьТЗДанныеФайлаНаСервере(АдресВременногоХранилища)
    
    Файл = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
    //Таб = Новый ТаблицаЗначений;
    //Таб.Колонки.Добавить("НомерПодразделения");
    //Таб.Колонки.Добавить("АдресПодразделения");
    //Текст = Новый ЧтениеТекста(";");
    //Пока Истина Цикл
    //  
        //Стр = Текст.ПрочитатьСтроку();
        //Если Стр = Неопределено Тогда
        //  Прервать;
        //КонецЕсли;
        //СтрТаб = Таб.Добавить();
        //ПолиСтр = СтрЗаменить(стр, ";", Символы.ПС);
        //СтрТаб.НомерПодразделения = СтрПолучитьСтроку(ПолиСтр, 1);
        //СтрТаб.АдресПодразделения = СтрПолучитьСтроку(ПолиСтр, 2);
    //КонецЦикла;
    //
КонецПроцедуры
В общем получается так что я в процедуре "ВыборФайлаОткрытие" выбираю файл, потом по нажатию кнопки ("ЗаполнитьТЗДанныеФайла")я хочу заполнить таблицу значений, и соответственно передаю управление серверу ("ЗаполнитьТЗДанныеФайлаНаСервере").

Прошу ткнуть носом в то, что я делаю не правильно.
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
03.06.2012, 17:08 17
Цитата Сообщение от Moshik Посмотреть сообщение
Выдает ошибку
Проверьте какого типа параметр АдресВременногоХранилища.
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 17:12  [ТС] 18
Цитата Сообщение от Fenomen Посмотреть сообщение
Проверьте какого типа параметр АдресВременногоХранилища.
Строка, значение: e1cib/tempstorage/8b4d21f9-2246-4819-9d2a-1773ea74175d

Тут вроде все правильно. Должна ведь быть строка, а значение вполне себе имя хранилища.
0
900 / 877 / 8
Регистрация: 15.03.2012
Сообщений: 2,680
03.06.2012, 17:58 19
Цитата Сообщение от Moshik Посмотреть сообщение
В общем получается так что я в процедуре "ВыборФайлаОткрытие" выбираю файл, потом по нажатию кнопки ("ЗаполнитьТЗДанныеФайла")я хочу заполнить таблицу значений, и соответственно передаю управление серверу ("ЗаполнитьТЗДанныеФайлаНаСервере").
Нажимая на кнопку вы вызываете ЗаполнитьТЗДанныеФайлаНаСервере() без параметра.
Процедура ВыборФайлаОткрытие, работает нормально и передает файл на сервер.
0
22 / 22 / 2
Регистрация: 28.01.2012
Сообщений: 52
03.06.2012, 18:42  [ТС] 20
Цитата Сообщение от Fenomen Посмотреть сообщение
Нажимая на кнопку вы вызываете ЗаполнитьТЗДанныеФайлаНаСервере() без параметра.
Процедура ВыборФайлаОткрытие, работает нормально и передает файл на сервер.
1C
1
2
3
4
5
6
&НаКлиенте
Процедура ЗаполнитьТЗДанныеФайла(Команда, АдресВременногоХранилища)
 
    ЗаполнитьТЗДанныеФайлаНаСервере(АдресВременногоХранилища);   
 
КонецПроцедуры
Если сделать так, то при отладке значение АдресВременногоХранилища неопределенно и в процедуре на сервере появляется ошибка:
Цитата Сообщение от
{Обработка.ИмпортНоменклатуры.Форма.Форма.Форма(49)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
Файл = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
по причине:
Недопустимое значение параметра (параметр номер '1')
0
03.06.2012, 18:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.06.2012, 18:42
Помогаю со студенческими работами здесь

Обработка формы и вывод значений в таблицу
Задание: Пользователь вводит число в форму на странице и нажимает кнопку «Ввод». После этого на...

Обработка: заполнение реквизита документа реквизитом другого документа
делаю обработку.В документе ПТУ в ТЧ товары есть Заказы, но в ТЧ товары нету Проекта, поэтому на...

Заполнение из текстового документа
Здравствуйте. У меня вопрос: Выбираю из текстового файла фамилию например: &quot;Иванов Иван Иванович&quot;...

Изменение текстового документа
Уважаемые программисты помогите написать программу которая изменяет текстовый документ в котором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru