ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript > ПО для Web разработчика
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Вычиталка строк.
  #1  
Старый 12.12.2009, 04:20
Аватар для -=lebed=-
-=lebed=-
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
Провел на форуме:
12702287

Репутация: 4738


По умолчанию Вычиталка строк.

Есть 1 файл, содержащий строки, заканчивающиеся \r\n
Есть 2 файл, содержащий строки, заканчивающиеся \r\n, являющийся подмножеством 1 файла.

Задача: получить 3 файл, состоящий из строк 1 файла, которых нет во втором файле. Т.е. сделать вычитание одного множества из другого.

На php писать 10-мин, отладить ещё 10. Но интересуют красивые и быстрые решения, которые будут работать быстро с файлами большого размера и не вылетать по ошибке нехватки памяти. Буду признателен, если увижу красивое и оптимальное решение поставленной задачи.
P.S. Для упрошения решения задачи: строки - это md5 хэши в символьном виде.
 
Ответить с цитированием

  #2  
Старый 12.12.2009, 05:08
Аватар для lukmus
lukmus
Постоянный
Регистрация: 18.11.2009
Сообщений: 709
Провел на форуме:
1410429

Репутация: 214


По умолчанию

на ruby писал для себя, помимо вычитание умеет еще складывать, сортировать, поднимать и опускать регистр
Код:
#!/usr/bin/ruby

n=ARGV.size
if n<=3 or n>5 
  puts "Not enought arguments\n <firstfile> <secondfile> <+|-> [outputfile] [-su<d|U>]"
  exit
end
$fi_file=ARGV[0]
$se_file=ARGV[1]
$sign=ARGV[2]
if $sign!='+' and $sign!='-'
  puts "Unknow argument #{$sign}"
  exit
end


def make (str)
  sort=false
  udcase=0
  uniq=false
  if str.include? 's' then sort=true end
  if str.include? 'd' then udcase=1 else
    if str.include? 'U' then udcase=2 else udcase=0 end
  end
  if str.include? 'u' then uniq=true end
  return sort,udcase,uniq
end

if n>3
  if !(ARGV[3].include?('-s') or ARGV[3].include?('-d') or ARGV[3].include?('-U') or ARGV[3].include?('-u'))
    $outfile=ARGV[3]
  else
    $outfile=$fi_file+$se_file+'_out'
    $sort,$udcase,$uniq=make ARGV[3]
  end

  if n==5 then  $sort,$udcase,$uniq=make ARGV[4] end

end


begin
 f_arr=IO.readlines($fi_file)
rescue => e
  puts "Can't read file #{$fi_file}:#{e}"
end

begin
 s_arr=IO.readlines($se_file)
rescue => e
  puts "Can't read file #{$se_file}:#{e}"
end

f_arr.each {|x| x.chop!}
s_arr.each {|x| x.chop!}

case $sign
when '-'
  r_arr=f_arr-s_arr
when '+'
  r_arr=f_arr+s_arr
end


if $udcase==1 
  puts "Downcase..."
  r_arr.each {|x| x.downcase!} 
end
if $udcase==2
  puts "Upcase..." 
  r_arr.each {|x| x.upcase!} 
end
if $uniq 
  puts "Delete repetitions..."
  r_arr.uniq! 
end
if $sort 
  puts "Sort..."
  r_arr.sort! 
end

begin
  puts "Create output file #{$outfile}"
  File.open($outfile,"w") {|file| r_arr.each {|x| file.puts x }}
rescue => e
  puts "Can't create file #{$outfile}:#{e}"
end
я думаю преобразование в cgi особого труда не составит
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обзор программ удаляющиx дубликаты строк Vanterlog ICQ 14 22.05.2010 12:13
[MySQL] Объединение строк (не через concat) Kuzya PHP, PERL, MySQL, JavaScript 0 14.08.2009 15:00
Добавление строк в DBGrid Kuzya С/С++, C#, Delphi, .NET, Asm 2 29.06.2009 22:00
Ограничение на кол-во строк recfrf Уязвимости 1 09.02.2009 23:21
Закон Sinay Авторские статьи 15 01.02.2009 22:55



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ