На каком языке логичней сделать эту программу вместо Паскаля

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

На каком языке логичней сделать эту программу вместо Паскаля

Сообщение NTFS » 20.07.2011 20:27:50

Собственно, есть задача несложной обработки текста, но с хитростями.

Я сделал за 1 час на Паскале потому что
1) Единственный язык общего назначения, которым я владею профессионально.
2) Были самописные полезные функции обработки строк.

А как лучше? Какой язык, по вашему мнению, больше подходит для этой задачи?

Вот код:

Код: Выделить всё
program tmpconverter;

{$mode objfpc}{$h+}

uses Classes, SysUtils, TAVStrUtils, simple_sql, simple_oper ;

var List,List1,ListOut,ListCountry,ListProp:TStringList ;
    i:Integer ;
    tekcountry:string ;
    floor,floorall:string ;
const
  ROOMTYPE_ID=1 ;
begin
  ListOut:=TStringList.Create ;
  ListCountry:=TStringList.Create ;
  if FileExists('country') then ListCountry.LoadFromFile('country') ;

  List:=TStringList.Create ;
  List.LoadFromFile(ParamStr(1)) ;
  for i:=0 to List.Count-1 do begin
    if StripChars(Trim(List[i]),'@')='' then Continue ;
    List1:=CreateStringListBySep(List[i],'@') ;
    if List1.Count=0 then begin end
    else begin
      Writeln(tekcountry) ;
      if Trim(List1[1])<>'' then tekcountry:=Trim(List1[1]) ;
      if ListCountry.IndexOf(tekcountry)=-1 then ListCountry.Add(tekcountry) ;

      if Trim(List1[10])='' then Continue ;

      ListProp:=TStringList.Create ;
      if Trim(List1[12])<>'' then ListProp.Values['Источник']:=Trim(List1[12]) ;

      if Pos('/',List1[3])<>0 then begin
        floor:=Trim(GetSplitPart1(List1[3],'/')) ;
        floorall:=Trim(GetSplitPart2(List1[3],'/')) ;
      end
      else begin
        floor:=Trim(List1[3]) ;
        floorall:=Trim(List1[4]) ;
      end ;
      ListProp.Values['Этаж']:=floor ;
      ListProp.Values['Этажность']:=floorall ;

      ListOut.Add(Format('INSERT INTO ROOMS (ID, OPERTYPE_ID, ROOMTYPE_ID, '+
       'COUNTRY_ID, OWNER_ID, REMARK, DATEENTER, LAST_UPDATE, PRICE, S, PROPSTORE, CONTACT) '+
       ' VALUES (GEN_ID(GEN_ROOMS_ID,1), 1, %d, %d, -1,''%s'',%s,%s,%d,%d,''%s'',''%s'');',[ROOMTYPE_ID,
       ListCountry.IndexOf(tekcountry)+1,
       PrepStringForSQLFB(List1[2]+' '+List1[13]+' '+List1[16]+' '+List1[17]),
       Alternate(Trim(List1[11])='','''Now''',''''+Trim(List1[11])+''''),
       Alternate(Trim(List1[11])='','''Now''',''''+Trim(List1[11])+''''),
       Round(StrToIntWt0(StripExceptDigits(List1[8]))/1000),
       StrToIntWt0(GetSplitPart1orAll(GetSplitPart1orAll(GetSplitPart1orAll(GetSplitPart1orAll(List1[5],','),'.'),'/'),'\')),
       PrepStringForSQLFB(ListProp.CommaText),
       PrepStringForSQLFB(List1[10])
       ])) ;
    end ;
    List1.Free ;
  end ;
  List.Free ;

  ListOut.SaveToFile('out_'+IntToStr(ROOMTYPE_ID)+'.sql') ;

  ListCountry.SaveToFile('country') ;
  with TStringList.Create() do begin
    for i:=0 to ListCountry.Count-1 do
      Add(Format('INSERT INTO COUNTRIES(ID, CITY, COUNTRY) VALUES (%d,''city'',''%s'');',
        [i+1,ListCountry[i]])) ;
    SaveToFile('country.sql') ;
    Free ;
  end ;

  ListOut.Free ;
  ListCountry.Free ;
end.



Функции, которые нестандартные (мои):
1) StripChars - удаляет из первого параметра все символы, входящие во второй параметр
2) CreateStringListBySep - создает TStringList, расщепляя строку по заданному символу
3) GetSplitPart1 - первая часть строки, по заданному разделителю
4) GetSplitPart2 - вторая часть строки, по заданному разделителю
5) GetSplitPart1orAll - первая часть строки, по заданному разделителю, если разделитель не найден - вся строка.
6) PrepStringForSQLFB - подготовка строки к записи в SQL
7) StripExceptDigits - убрать из строки все, кроме цифр
8) Alternate - аналог С-конструкции a?b:c
9) StrToIntWt0 - если строка пустая, то вернет 0, иначе работает как StrToInt
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение hinst » 20.07.2011 20:31:17

по-моему и на паскале нормально. Я ещё жабу хорошо знаю, так что, ничего лучше, кроме как "на жабе" придумать не могу, только ничего принципиально нового от этого не изменится, будет та же программа, только на жабе. В каком месте она из-за этого станет лучше, я не знаю, вообще жаба на паскаль похожа. Я не шучу.
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение NTFS » 20.07.2011 20:40:08

В реализации на Паскале меня напрягает:
1) раздутость кода
2) обилие самописных костылей

Думаю, здесь нужен какой-то скриптовый язык с отличной поддержкой строк и их обработки. "Имя, сестра, имя?"(С)
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение alex208210 » 20.07.2011 21:17:35

мнение не мое и я не проверял и не пробовал), но я точно где то слышал что для обработки строк лучший вариант это python..
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение Odyssey » 20.07.2011 21:34:46

Python?
(Вышеприведённую программу сходу на него не переведу, поскольку знаю его "со словарём").

Субъективные плюсы по сравнению с Pascal:
+ программа состоит из 1 файла, редактируем и запускаем (хотя теперь это уже не так актуально благодаря InstantFPC, но его пока нет в FPC "из коробки");
+ хорошая стандартная библиотека, в т.ч. регулярные выражения => не нужно таскать с файлом скрипта дополнительных модулей;
+ более лаконичный код (ценой перекладывания смысла на отступы).

Но есть и субъективные минусы:
- отсутствие комбайнов типа TStringList с разношёрстными, но полезными методами. После Pascal особенно неприятно вместо ListCountry.LoadFromFile('country') писать велосипед с открытием файла и считыванием оттуда строк.
- после работы с FPC не всегда оправдываются ожидания по производительности. В FPC я примерно знаю способ внутреннего представления данных и могу спрогнозировать скорость выполнения моего кода. Когда не знаю - лезу в исходники через Lazarus IDE и Ctrl+Click и всё равно могу спрогнозировать. А в Python есть хорошо оптимизированные и плохо оптимизированные функции, и какие из них какие, иногда получалось узнать только у гугла. Можно, конечно, скачать исходники CPython, но такой интеграции в IDE моих исходников с библиотечными не добиться.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение Brainenjii » 20.07.2011 21:49:43

Не, для обработки строк лучше всего Perl.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение Sash0k » 20.07.2011 22:27:20

>Собственно, есть задача несложной обработки текста

Для подобных задач хорошо подходит perl, благодаря регулярным выражениям.

НО! существуют свободные реализации regexp на паскале, гугль находит даже на этом форуме :)

Поэтому логично использовать паскаль, просто переписав обработку текста с использованием регулярных выражений
Sash0k
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2009 11:39:27
Откуда: Вятка - Киров

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение Сквозняк » 21.07.2011 12:23:42

alex208210 писал(а):мнение не мое и я не проверял и не пробовал), но я точно где то слышал что для обработки строк лучший вариант это python..
Ага, будет проще, но какие будут глюки при запуске на интерпретаторе не той версии, питонщики умалчивают. Им-то что, они его хорошо знают и могут постоянно переписывать проблемные исходники, а если переписать некому, то программа считается устаревшей и ненужной.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение Kitayets » 21.07.2011 17:21:00

зачем переписывать, то что уже написано и работает?

для самообразования плюсую perl.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение bw » 21.07.2011 20:34:37

> писать велосипед с открытием файла и считыванием оттуда строк
open('country').readlines()

> на интерпретаторе не той версии
Такие же как и на компиляторе любого другого языка. Обратная совместимость в мажорной версии имеется (написанное на 2.3 будет работать на 2.7, наоборот -- нет :-).

На Python это бы выглядело примерно так:
Код: Выделить всё
# -*- coding: utf-8 -*-

import os
import sys
import re

ROOMTYPE_ID = 1

result    = []
countries = os.path.isfile('country') and open('country').readlines() or []
lines     = 1 < len(sys.argv) and open(' '.join(sys.argv[1:])).readlines() or []

tekcountry = ''

for line in lines:
   line  = line.strip(' @')
   list1 = map(str.strip, line.split('@'))

   if list1:
      tekcountry = list1[1] or tekcountry

      print tekcountry

      if not tekcountry in countries:
         countries.append(tekcountry)

      if list1[10]:
         props = {}

         if list1[12]:
            props['Источник'] = list1[12]

         if '/' in list1[3]:
            floor, floorall = map(str.strip, list1[3].split('/', 1))
         else:
            floor, floorall = list1[3], list1[4]

         props['Этаж']      = floor
         props['Этажность'] = floorall

         result.append('INSERT INTO ROOMS (ID, OPERTYPE_ID, ROOMTYPE_ID, '\
            'COUNTRY_ID, OWNER_ID, REMARK, DATEENTER, LAST_UPDATE, PRICE, S, PROPSTORE, CONTACT) '\
            'VALUES (GEN_ID(GEN_ROOMS_ID,1), 1, %d, %d, -1,\'%s\',%s,%s,%.0f,%d,\'%s\',\'%s\');'%(
               ROOMTYPE_ID,
               countries.index(tekcountry) + 1,
               PrepStringForSQLFB(' '.join((list1[2], list1[13], list1[16], list1[17]))),
               list1[11] or '\'Now\'',
               list1[11] or '\'Now\'',
               float(re.sub('\D', '', list1[8]) or 0) / 1000.0,
               int(list1[5].split(',')[0].split('.')[0].split('/')[0].split('\\')[0] or 0),
               PrepStringForSQLFB(map('{0[0]}="{0[1]}"'.format, props.items())),
               PrepStringForSQLFB(list1[10])))

open('out_%d.sql'%ROOMTYPE_ID, 'wb').writelines(result)
open('country', 'wb').writelines(countries)

countries_sql = ['INSERT INTO COUNTRIES(ID, CITY, COUNTRY) VALUES (%d,\'city\',\'%s\');'%(1 + i, country)
   for i, country in enumerate(countries)]

open('country.sql', 'wb').writelines(countries_sql)


..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение NTFS » 21.07.2011 23:00:01

Спасибо за ответы. Попробую посмотреть насчет Perl и Python. Хотя скрипт на Питоне не сильно короче Паскаль-варианта.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение dunin » 21.07.2011 23:29:22

NTFS писал(а):...
9) StrToIntWt0 - если строка пустая, то вернет 0, иначе работает как StrToInt

StrToIntDef

По сабжу: не совсем понял, а какой смысл искать "другой язык", если все прекрасно реализуется на паскале? От добра добра не ищут, ИМХО.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение bw » 22.07.2011 02:00:22

> не сильно короче Паскаль-варианта
А ты выкини из варианта в Pascal эти магическии функции и используй только батарейки :-). Ну ладно, включи описание этих функций в свой пример.
Код на Python всё же более разряженным получился, может быть даже читабельнее, ну это кому как. Ведь всегда можно убрать пустые строки и вообще собирать всё в одну, только зачем. Странное желание сократить объём. Да и пример пожалуй не столь показателен в этом плане.

p.s. Хотелось бы ещё вариант на Perl увидеть, кто тут мастер?

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: P.S. Работать в Oracle - западло, какие бы деньги не предлаг

Сообщение vada » 22.07.2011 13:36:46

На каком языке логичней сделать эту программу вместо Паскаля


А смысл?

Я сделал за 1 час на Паскале потому что
1) Единственный язык общего назначения, которым я владею профессионально.
2) Были самописные полезные функции обработки строк.

Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: На каком языке логичней сделать эту программу вместо Паскаля

Сообщение sanjok » 22.07.2011 13:54:47

Логичнее всего сделать эту программу на родном и понятном Вам языке.
sanjok
незнакомец
 
Сообщения: 8
Зарегистрирован: 24.05.2011 08:49:07

След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru
cron