helpf.pro
Регистрация

v8: Чтение ТХТ файла

Farmar
27.04.2012 13:33Прочитано: 2689
Есть файл txt со всеми разделителями, как положено, проблема в том, что после формирования ТЗ нужно пройтись по строчкам и при определенных условиях свернуть ту или иную строчку, причем не известно сколько строк нужно сварачивать, 1,2 или 3. это можно выбрать условием.

Процедура ЧтениеТХТФайла(Элемент)

// Проверка на наличие имени файла
Если ПустаяСтрока(ИмяФайла) Тогда
Предупреждение("Для запуска обработки необходимо предварительно выбрать файл данных.");
Возврат;
КонецЕсли;

// Открыть файл, создать текстовый документ, прочитать
ПотокСтрок = ПолучитьПотокЧтенияСтрок(ИмяФайла);

// Очистить предыдущие значения
ТаблицаДокумента.Очистить();
ТаблицаДокумента.Колонки.Очистить();

// Создать колонки табличного документа
//ТаблицаДокумента.Колонки.Добавить("Номер",,"Номер",5);
ТаблицаДокумента.Колонки.Добавить("Номенклатура",,"Номенклатура",);
ТаблицаДокумента.Колонки.Добавить("Код",,"Код",);
ТаблицаДокумента.Колонки.Добавить("УсловноеОбозначение",,"УсловноеОбозначение",);
ТаблицаДокумента.Колонки.Добавить("Количество",,"Количество",);
ТаблицаДокумента.Колонки.Добавить("Цена",,"Цена",);
ТаблицаДокумента.Колонки.Добавить("Стоимость",,"Стоимость",);
ТаблицаДокумента.Колонки.Добавить("СуммаАкциза",,"СуммаАкциза",);
ТаблицаДокумента.Колонки.Добавить("НДС",,"НДС",);
ТаблицаДокумента.Колонки.Добавить("СуммаНалога",,"СуммаНалога",);
ТаблицаДокумента.Колонки.Добавить("СтоимостьСНДС",,"СтоимостьСНДС",);
ТаблицаДокумента.Колонки.Добавить("ЦифровойКод",,"ЦифровойКод",);
ТаблицаДокумента.Колонки.Добавить("СтранаПроисхождения",,"СтранаПроисхождения",);
ТаблицаДокумента.Колонки.Добавить("НТД",,"НТД",);

// Последовательное чтение строк текстового файла
КоличествоСтрок = ПотокСтрок.КоличествоСтрок();
Для Строка = 28 По КоличествоСтрок Цикл

// Обработка нажатия Ctrl + Break
ОбработкаПрерыванияПользователя();

// Чтение строки из файла тхт / csv
СтрокаИзФайла = ПотокСтрок.ПолучитьСтроку(Строка);
Если СтрокаИзФайла = "+----------------------------------------+---+---------+------+---------+------------+------+---+---------+-----------+----+---------------+----------------------------" Тогда
Прервать;
КонецЕсли;
// Разбор строки в массив, используя в качествен символа-разделителя "¦"
МассивСтрок = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаИзФайла,"¦");

// Добавить данные в табличную часть экранной формы
Стр=ТаблицаДокумента.Добавить();
//Стр.Номер = СокрЛП(Строка);
Стр.Номенклатура = СокрЛП(МассивСтрок[1]);
Стр.Код = СокрЛП(МассивСтрок[2]);
Стр.УсловноеОбозначение = СокрЛП(МассивСтрок[3]);
Стр.Количество = СокрЛП(МассивСтрок[4]);
Стр.Цена = СокрЛП(МассивСтрок[5]);
Стр.Стоимость = СокрЛП(МассивСтрок[6]);
Стр.СуммаАкциза = СокрЛП(МассивСтрок[7]);
Стр.НДС = СокрЛП(МассивСтрок[8]);
Стр.СуммаНалога = СокрЛП(МассивСтрок[9]);
Стр.СтоимостьСНДС = СокрЛП(МассивСтрок[10]);
Стр.ЦифровойКод = СокрЛП(МассивСтрок[11]);
Стр.СтранаПроисхождения = СокрЛП(МассивСтрок[12]);
Стр.НТД = СокрЛП(МассивСтрок[13]);
// Отобразить информацию о ходе выполнения обработки
Состояние("Обработка строки файла : "
+ "строка " + Строка + " из " + КоличествоСтрок);

КонецЦикла;

МояТЗ = Новый ТаблицаЗначений;

Для сч = 0 По ТаблицаДокумента.Количество()-1 Цикл


Сообщить("123");

КонецЦикла;
// Отобразить результаты загрузки в форме элемента
ЭлементыФормы.ТаблицаДокумента.Значение = МояТЗ;
ЭлементыФормы.ТаблицаДокумента.СоздатьКолонки();

КонецПроцедуры // ЧтениеTXTФайла(Элемент)

Функция ПолучитьПотокЧтенияСтрок(Файл)
Попытка
// Используется для доступа к параметрам файлов или каталогов.
ТекстовыйФайл = Новый Файл(Файл);
Если ТекстовыйФайл.Существует() = Ложь Тогда
Сообщить("Файла "+Файл+" не существует!");
Возврат Неопределено;
КонецЕсли;
// Текстовый документ предназначен для работы с текстами.
// Объект позволяет получать и сохранять текст в файле,
// работать со строками
ПотокЧтенияСтрок = Новый ТекстовыйДокумент();
ПотокЧтенияСтрок.Прочитать(Файл);
Исключение
Сообщить("Файл не прочитан.", СтатусСообщения.Внимание);
Сообщить(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
// Возвращает текст, извлеченный из файла
Возврат ПотокЧтенияСтрок;
КонецФункции // ПолучитьПотокЧтенияСтрок
Yandex
Возможно, вас также заинтересует
Реклама на портале
Farmar
27.04.2012 13:43Ответ № 1
МояТЗ = Новый ТаблицаЗначений;

Для сч = 0 По ТаблицаДокумента.Количество()-1 Цикл


Сообщить("123");

КонецЦикла;
Это лишнее!
Farmar
27.04.2012 16:49Ответ № 2
Может кто подскажет как перебрать строки????
Mokey
27.04.2012 16:56Ответ № 3
Во-первых, строки по условиям можно выбрать функцией НайтиСтроки(Отбор).
Во-вторых, в ТаблицаДокумента добавляем ещё одну колонку с типом будево, например, "НаУдаление".
В-третьих, отбираем строки по условию, добавляем новую строку, проходимся по массиву найденных строк и складываем необходимые ресурсы в новую строку, при этом у этих строк выставляем в ИСТИНА колонку "НаУдаление".
в-четвёртых, цикл по строкам:
Пока ИСТИНА Цикл
НайденнаяСтрока = ТаблицаДокумента.Найти(ИСТИНА, "НаУдаление");
Если НайденнаяСтрока = Неопределено Тогда
Прервать;
Иначе
ТаблицаДокумента.Удалить(НайденнаяСтрока);
КонецЕсли;
КонецЦикла;

Последнюю операцию можно и функцией НайтиСтроки реализовать, это не столь важно.
В конце колонку "НаУдаление" можно удалить, чтобы не мешала на визуальных объектах
Изменено 27.04.12 17:36:13
Farmar
28.04.2012 10:51Ответ № 4
Как сложить в новую строку?
Mokey
28.04.2012 14:14Ответ № 5
(4) Farmar, например:
Код 1C v 8.х
 
МассивСтрок = ТЗ.НайтиСтроки(Новый Структура("Колонка1", ЗначениеКолонки1));
Если МассивСтрок.Количество() > 1 Тогда
НоваяСтрока = ТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, МассивСтрок[0]); //заполняем колонки в новой строке
НоваяСтрока.Ресурс1 = 0;
НоваяСтрока.Ресурс2 = 0; // и т.д. смотря какие ресурсы Вы хотите сложить
Для Каждого СтрокаМассива Из МассивСтрок Цикл
НоваяСтрока.Ресурс1 = НоваяСтрока.Ресурс1 + СтрокаМассива.Ресурс1;
НоваяСтрока.Ресурс1 = НоваяСтрока.Ресурс2 + СтрокаМассива.Ресурс2;
...
СтрокаМассива.НаУдаление = Истина;
КонецЦикла;
КонецЕсли;
Farmar
02.05.2012 10:08Ответ № 6
Код 1C v 8.х
 	ТаблицаДокумента.Колонки.Добавить("Свертка", Новый ОписаниеТипов("Булево"));
Для Каждого ТекущаяСтрока Из ТаблицаДокумента Цикл
Если ЗначениеЗаполнено(ТекущаяСтрока.Цена) Тогда
ТекущаяСтрока.Свертка = Истина;
Сообщить(ТекущаяСтрока.Код);
Иначе
Сообщить(ТекущаяСтрока.Цена);
КонецЕсли;
Если ТекущаяСтрока.Свертка = Истина Тогда

КонецЦикла;

Значение истина ставиться для строк в которых заполнено значение "Цена", следовательно эта строка является полностью заполненной, смотрю следующую строку, если поле цена у нее не заполнена, тогда она принадлежит к предыдущей строке и их нужно сложить. На предыдущем примере не понял, если можно под мой код прикинуть. Помогите.
Mokey
03.05.2012 08:58Ответ № 7
(6) Farmar, а что складывать собираетесь?
Farmar
03.05.2012 09:32Ответ № 8
Строки. Наименование номенклатуры там будет.
Mokey
03.05.2012 09:50Ответ № 9
(8) Farmar, если там нет больше ресурсов, не проще ли удалить "лишнюю" строку с пустой ценой? Или Вы не всё договариваете?
Farmar
03.05.2012 10:04Ответ № 10
Структура такая:
¦Картридж "все-в-одном" Canon LBP800/ ¦796¦ шт ¦ 2¦ 1455.41¦ 2910.81¦ без ¦18%¦ 523.95¦ 3434.76¦ 392¦ЯПОНИЯ ¦ 10125170/241209/0038531/2
¦LBP810/LBP1120 EP-22 Black 2500 стр. (o) ¦ ¦ ¦ ¦ ¦ ¦акциза¦ ¦ ¦ ¦ ¦ ¦

если удалять нижнюю строку, то тогда получиться не полная номенклатура и я её просто не найду в базе, а если найду то там их может быть много.
Mokey
03.05.2012 10:10Ответ № 11
(10) Farmar, а как Вы хотите сложить эти две строки? Что в итоге должно получиться?
Farmar
03.05.2012 10:18Ответ № 12
в итоге получается ТаблицаДокумента, это разделитель колонок "¦". т.е. получается одинаковое количество столбцов в обоих строках,. Сложение должно быть не как сумма 2+2, а 22, добавление текста к предыдущей строке.
Farmar
03.05.2012 10:26Ответ № 13
Могу обработку скинуть, может так проще понять будет?
Mokey
03.05.2012 10:36Ответ № 14
да нет, не надо, я вот про первый столбец думаю, какой он будет в итоге?
Farmar
03.05.2012 10:42Ответ № 15
Картридж "все-в-одном" Canon LBP800/LBP810/LBP1120 EP-22 Black 2500 стр. (o)
Farmar
03.05.2012 11:17Ответ № 16
Тут подсказывают, счетчиком по индексам идти, т.к. метод для каждого не всегда отрабатывает нормально. Поэтому все это не подходит) Буду пытаться сделать как говорят.
Mokey
03.05.2012 14:57Ответ № 17
(16) Farmar, кто это Вам такое подсказал? Хотя, возможно, да
Изменено 03.05.12 15:02:13
Mokey
03.05.2012 15:24Ответ № 18
У вас всегда на две строчки разбито (максимум)?
Если да, то во втором условии надо получить строчку с индексом Текущий-1 и произвести конкантенацию строковых полей.
Изменено 03.05.12 15:25:10
Farmar
03.05.2012 15:25Ответ № 19
В этом и беда, не известно сколько строк может быть)
Mokey
03.05.2012 15:51Ответ № 20
(19) Farmar, Это не беда, можно двумя таблицами решить вопрос.
Код 1C v 8.х
 ТаблицаДокумента.Колонки.Добавить("Свертка", Новый ОписаниеТипов("Булево"));
ВремТЗ = ТаблицаДокумента.СкопироватьКолонки();
Для нн = 0 По ТаблицаДокумента.Количество()-1 Цикл
ТекСтрока = ТаблицаДокумента[нн];
Если ЗначениеЗаполнено(ТекСтрока.Цена) Тогда
НоваяСтрока = ВремТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
Иначе
Для Каждого Колонка Из ТекСтрока.Колонки Цикл
Если ТипЗнч(Колонка) = Тип("Строка") Тогда
НоваяСтрока[Колонка] = СокрЛП(НоваяСтрока[Колонка]) + СокрЛП(ТекСтрока[Колонка]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

На выходе имеем ВремТЗ со свернутыми строками.
Изменено 03.05.12 15:52:55
Farmar
10.05.2012 10:47Ответ № 21
Спасибо!
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.