 |

12.12.2009, 04:20
|
|
Флудер
Регистрация: 21.06.2006
Сообщений: 3,193
С нами:
10467746
Репутация:
4738
|
|
Вычиталка строк.
Есть 1 файл, содержащий строки, заканчивающиеся \r\n
Есть 2 файл, содержащий строки, заканчивающиеся \r\n, являющийся подмножеством 1 файла.
Задача: получить 3 файл, состоящий из строк 1 файла, которых нет во втором файле. Т.е. сделать вычитание одного множества из другого.
На php писать 10-мин, отладить ещё 10. Но интересуют красивые и быстрые решения, которые будут работать быстро с файлами большого размера и не вылетать по ошибке нехватки памяти. Буду признателен, если увижу красивое и оптимальное решение поставленной задачи.
P.S. Для упрошения решения задачи: строки - это md5 хэши в символьном виде. 
|
|
|

12.12.2009, 05:08
|
|
Постоянный
Регистрация: 18.11.2009
Сообщений: 709
С нами:
8674045
Репутация:
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 |
Skype, IRC, ICQ, Jabber и другие IM |
54 |
20.01.2020 16:01 |
|
[MySQL] Объединение строк (не через concat)
|
Kuzya |
PHP |
0 |
14.08.2009 15:00 |
|
Добавление строк в DBGrid
|
Kuzya |
С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby |
2 |
29.06.2009 22:00 |
|
Ограничение на кол-во строк
|
recfrf |
Уязвимости |
1 |
09.02.2009 23:21 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|