Автор Тема: 1с 7.7 - распарсить строки  (Прочитано 10993 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
1с 7.7 - распарсить строки
« : ѕЪвпСам 03, 2007, 12:18:45 pm »
Здравствуйте, я вот решил что сделать:
Нужно открыть файл и считать от туда информацию.
И занести в переменные (а,б,в...) текст до разделителя.
т.е. в пер а = 01860
б = 75131
в = 30360
г = 090300
д = 36000
е = 01860
щ = 7-5011-H-01
и тд..
 = 24

ФАЙЛ:
018607513130360 09030036000 
0186065265303600806003500
0344206513020   09120020   
036427-5011-H-011002002

Мой текст:
Процедура Сформировать()   
   Перем а,б,в, Длина;
ТекстД = СоздатьОбъект("Текст");
ТекстД.Открыть("DataFile4.txt");

Для Счетчик = 1 По ТекстД.КоличествоСтрок() Цикл
СтрокаН = ТекстД.ПолучитьСтроку(Счетчик);
       
   
Сообщить (СтрокаН);
КонецЦикла ;           

            Длина = СтрПолучитьСтроку(ТекстД,1);
  Сообщить(Длина);         
в = КодСимв (""); 
сообщить(в);

ТекстД.Показать();
КонецПроцедуры 
« Последнее редактирование: ѕЪвпСам 04, 2007, 01:30:40 pm от Granata005 »

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: !с 7.7
« Ответ #1 : ѕЪвпСам 03, 2007, 12:52:42 pm »
Ой, как-то некрасиво...

1. Большое количество переменных заменяется ТаблицейЗначений (своего рода массивы).
2. Файл формата "018607513130360 09030036000" можно легко преобразовать в dbf.

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
Re: !с 7.7
« Ответ #2 : ѕЪвпСам 03, 2007, 06:01:28 pm »
а вас не затруднит полное решение с кодом?
Я только вчера начал сидеть на 1С. И нуждаюсь в активной помощи))

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: !с 7.7
« Ответ #3 : ѕЪвпСам 03, 2007, 06:35:00 pm »
Ок, без проблем, мне лишняя практика не помешает.
ВОт только для этого нужно иметь более правильно поставленную задачу.. что с этими данными планируется делать?

Опиши полностью задачу и желательно выложи файл - сделаем вместе :)
« Последнее редактирование: ѕЪвпСам 03, 2007, 06:42:23 pm от Granata005 »

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
Re: !с 7.7
« Ответ #4 : ѕЪвпСам 03, 2007, 06:50:32 pm »
Главная цель поместить данные(цифры и буквы) в переменные или массив. Делать с ними я сам не со всем представляю что. Я попросил задачку не сложного уровня, вот мне и придумали эту. Возможно эти данные будут просто вводится в БД как расшифровка штрих-кода.

Надеюсь более менее ясно рассказал -)

Мое виденье задачи:
1.Считываем весь файл в цикле и выводим на экран.
2.Выделяем первую строчку и помещаем ее переменную
3.Работаем с этой переменной, с помощью функции Лев выхватываем первые 5 символов(до ограничительного знака) и записываем в переменную.
4.И так далее до самого конца.

Щас выложу этот файл в txt, т.к. там наглядно видны разграничения

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
Re: !с 7.7
« Ответ #5 : ѕЪвпСам 03, 2007, 06:54:40 pm »
Вот

[вложение удалено Администратором]

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: !с 7.7
« Ответ #6 : ѕЪвпСам 03, 2007, 07:52:47 pm »
Для начала выложу как я выявил какие символы у тебя есть в этих файлах.

//*******************************************
Процедура НайтиСтранныеHEXКоды()  //глазками
ТекстД = СоздатьОбъект("Текст");   
ТекстД.КодоваяСтраница(1);         
ТекстД.Открыть("D:\DataFile5.TXT");   
Для Счетчик = 1 По  ТекстД.КоличествоСтрок() Цикл
СтрокаН = ТекстД.ПолучитьСтроку(Счетчик);
для ч=1 по СтрДлина(СтрокаН) цикл   
сообщить(Сред(СтрокаН,ч,1)+"="+КодСимв(Сред(СтрокаН,ч,1)));
конеццикла;             
КонецЦикла ;     
КонецПроцедуры     
//*******************************************
В итоге я увидел что разделителями у тебя выступают символы под кодом 24 и 29 (те самые );

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: !с 7.7
« Ответ #7 : ѕЪвпСам 03, 2007, 08:36:35 pm »
Сейчас вот разобрался как заменить твои символы на символ перехода в новую строку - теперь осталось это дело запихнуть в таблицу значений...

//*******************************************
Процедура Сформировать()   
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка();
ТекстД = СоздатьОбъект("Текст"); 
ТекстИтоговый = СоздатьОбъект("Текст");
ТекстД.КодоваяСтраница(1);          
ТекстД.Открыть("D:\DataFile4.TXT");  
Для Счетчик = 1 По  ТекстД.КоличествоСтрок() Цикл
СтрокаН = ТекстД.ПолучитьСтроку(Счетчик);
СтрокаН2=СтрЗаменить(СтрокаН,Симв(24),РазделительСтрок);
СтрокаН3=СтрЗаменить(СтрокаН2,Симв(29),РазделительСтрок);
ТекстИтоговый.ДобавитьСтроку(Строкан3);
Сообщить(Строкан3);
КонецЦикла ;         
      
Сообщить(ТекстИтоговый.КоличествоСтрок()); 
Для Счетчик = 1 По  ТекстИтоговый.КоличествоСтрок() Цикл
СтрокаН = ТекстИтоговый.ПолучитьСтроку(Счетчик);
Сообщить(Строкан3);
КонецЦикла ; 
КонецПроцедуры
//*******************************************


Так, ладно, мне спать пора; а ты что надумаешь - пиши.
Нужно расчленить получившуюся многострочную строку (обрати внимание на синие флажочки в окне сообщений);
« Последнее редактирование: ѕЪвпСам 03, 2007, 08:51:10 pm от Granata005 »

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: !с 7.7
« Ответ #8 : ѕЪвпСам 04, 2007, 09:23:45 am »
Вообще я нашёл способ...
измененять разделитель на запятую (а не на РазделительСтрок), подгружать эти данные в СписокЗначений, а список значений подгружать в таблицу значений....
Но мне этот способ не нравится - не красиво... впрочем что можно назвать "красивым" в методах программирования бейсикоподобного языка 1С - ничего :(

Есть ещё конечно вариант который первый пришёл на ум - пробежаться по символам строк, но это ешё намного хуже...
Так что или попытайся доделать то что я тебе показал с помощью списка значений, или я что-нибудь новое придумаю (а со списком значений у меня вариант уже готовый - просто не хочу его вылаживать).
« Последнее редактирование: ѕЪвпСам 04, 2007, 09:26:37 am от Granata005 »

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
Re: 1с 7.7 - распарсить строки
« Ответ #9 : ѕЪвпСам 04, 2007, 06:49:24 pm »
Я тут пообщался с тем кто мне дал задачку выяснилось:
Что нужно именно в переменные. Всего будет 4 переменные(1 перем на 1 строчку).
Делаем это в цикле и получится что в перем а будет вначале значение 01860 до разделителя, потом дальше по строчке.
В итоге новые данные будут затирать старые, но это не важно.
Значит нужно 4 переменные, 1-2 строчки в цикле и все)
Вопрос какие это будут строчки. Никаких доп циклов не надо =)

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: 1с 7.7 - распарсить строки
« Ответ #10 : ѕЪвпСам 05, 2007, 09:43:40 am »
Глупое задание...
Намного быстрее работать с таблицей значений и со всей строкой, чем с посимвольным перебором...
Сейчас сделаю...

.........................................
**спустя 20 минут отплёвываясь в комнату входит бомб...
- "Фе, как некрасиво!!!" - сказал он.


Я тебе набросочку сброшу - ты посмотри, если сам не додумаешся - подскажу :)

//*******************************************
Процедура Сформировать() 
TextToWork = CreateObject("Текст"); 
TextToWork.SetCodePage(1);           
TextToWork.Открыть("D:\DataFile4.TXT");   
for Счетчик = 1 to  TextToWork.КоличествоСтрок() do
СтрокаН = TextToWork.GetLine(Счетчик);   
a="";b="";c="";count=0;countLeft=1;
for temp=1 to StrLen(СтрокаН) do 
char1=Mid(СтрокаН,temp,1);
if (char1=Chr(24)) or (char1=Chr(28)) then   
count=count+1;     
////туточки
endif;         
enddo;
enddo;         
КонецПроцедуры
                               
 Специально написал в английском эквиваленте... т.к. не все форумчане знают что 1С одинаково воспринимает и английские команды и русские...

« Последнее редактирование: ѕЪвпСам 05, 2007, 10:10:12 am от Granata005 »

Оффлайн miph

  • Губернский секретарь
  • **
  • Сообщений: 26
  • Репутация: 0
Re: 1с 7.7 - распарсить строки
« Ответ #11 : ѕЪвпСам 08, 2007, 02:15:21 pm »
Вот примерно так нужно было сделать! Спасибо Granata005 за подсказки и потраченное время ;)

Процедура ДляОднойСтроки()
текст_файл=СоздатьОбъект("Текст");
текст_файл.Открыть("F:\0_текст\DataFile12.TXT");
ПолученнаяСтрока=текст_файл.ПолучитьСтроку(4);
позПервогоРазделителя=Найти(ПолученнаяСтрока,Симв(24));
ПервыйРекв=Лев(ПолученнаяСтрока,позПервогоРазделителя-1);
КодТовара=ПервыйРекв;
Сообщить("Код Товара = "+КодТовара);
новСтрока1=Сред(ПолученнаяСтрока,позПервогоРазделителя+1);
позВторогоРазделителя=Найти(новСтрока1,Симв(24));
ВторойРекв=Лев(новСтрока1,позВторогоРазделителя-1);
Обрезка=Найти(ВторойРекв,Симв(29));
РеквLOT=Лев(ВторойРекв,Обрезка-1);
Сообщить("Реквизт LOT = "+РеквLOT);
новСтрока2=Сред(новСтрока1,позВторогоРазделителя+1);
позТретьегоРазделителя=Найти(новСтрока2,Симв(24));
ТретийРекв=Лев(новСтрока2,позТретьегоРазделителя-1);
СрокХран=ТретийРекв;
Сообщить("Срок Хранения в формате ГГММДД = "+СрокХран);
новСтрока3=Сред(новСтрока2,позТретьегоРазделителя+1);
Колво=СокрЛП(новСтрока3);
Сообщить("Количество = "+Колво);
//Значениями полученных реквизитов заполним
//табличную часть документа ПоступлениеТМЦ
ном=СоздатьОбъект("Справочник.Номенклатура");
Если  ном.НайтиПоРеквизиту("EAN128",КодТовара,1)=0 Тогда
Возврат ;
Предупреждение("Номенклатура со штрихкодом "+КодТовара+" не найдена!");
КонецЕсли;
номДок=ном.ТекущийЭлемент();
док=СоздатьОбъект("Документ.ПоступлениеТМЦ");
док.Новый();
док.ДатаДок=ТекущаяДата();
док.НоваяСтрока();
док.Номенклатура=номДок;
// док.=Колво;
док.LOT=РеквLOT;
док.Количество=Колво;
док.Записать();

КонецПроцедуры//ДляОднойСтроки

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: 1с 7.7 - распарсить строки
« Ответ #12 : ѕЪвпСам 08, 2007, 02:33:00 pm »
Ты решил всё таки без цикла делать :)

Ну и правильно, так проще... а вообще если бы в 1С был бы case - то можно было бы его юзать в цикле, или 4 ифа... ну просто как вариант.

А вообще: если эта задача для учёбы, то тебя учат не оптимизируя код писать многочасовые обработки :)

СЗ=СоздатьОбъект("СписокЗначений");
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка(1);
ТЗ.НоваяКолонка(2);
ТЗ.НоваяКолонка(3);
ТЗ.НоваяКолонка(4);
Текст=СоздатьОбъект("Текст");
Текст.Открыть("Файл.txt");
Для к=1 по Текст.КоличествоСтрок() цикл
 СЗ.ИзСтрокиСРазделителями(СтрЗаменить(Текст.ПолучитьСтроку(к)," ",""","""));
   ТЗ.НоваяСтрока();
   Для и=1 по ТЗ.КоличествоКолонок() цикл
     ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,и,СЗ.ПолучитьЗначение(и));
   КонецЦикла;
КонецЦикла;
http://mista.ru/kb/mista_kb.rar

Оффлайн Sinobi

  • Модератор раздела
  • Коллежский асессор
  • *****
  • Сообщений: 294
  • Репутация: 7
  • Пол: Мужской
  • Синоби-но-моно из клана Ига
Re: 1с 7.7 - распарсить строки
« Ответ #13 : ґХЪРСам 06, 2007, 12:55:20 pm »
Проще всего переконвертить файл в ДБФ (например, экселем)
А потом все просто

Не стоит все усложнять и парсить текст средствами 1С
Мудрость приходит со старостью... а иногда старость приходит одна

Оффлайн Granata005

  • злой бомб
  • Статский советник
  • *****
  • Сообщений: 891
  • Репутация: 31
  • Пол: Мужской
  • Lantorg.com
Re: 1с 7.7 - распарсить строки
« Ответ #14 : ґХЪРСам 06, 2007, 06:09:41 pm »
Ну это само-собой :)

но насколько я понял это задание было дано преподователем/испытателем...