У меня есть некоторые большие файлы фиксированной ширины, и я должен отбросить строку заголовка.
Отслеживание итератора не кажется очень идиоматичным.
# This is what I do now.
File.open(filename).each_line.with_index do |line, idx|
if idx > 0
...
end
end
# This is what I want to do but I don't need drop(1) to slurp
# the file into an array.
File.open(filename).drop(1).each_line do { |line| ... }
Какова идиома Ruby для этого?
В основном требуется объединить две таблицы, в которых оба столбца QID не равны null, правильно? Однако вы не выполняете никаких других условий, таких как два значения QID (что мне кажется странным, но хорошо). Что-то такое простое, как следующее (протестировано в MySQL), кажется, делает то, что вы хотите:
SELECT * FROM `Y` INNER JOIN `X` ON (`Y`.`QID` IS NOT NULL AND `X`.`QID` IS NOT NULL);
Это дает вам все ненулевые строки в Y, присоединенные к каждой ненулевой строке в X.
Update: Рико говорит, что он также хочет строки со значениями NULL, почему бы не просто:
SELECT * FROM `Y` INNER JOIN `X`;
-121--1257649- IF EXISTS ( SELECT TOP 1 ID, Name FROM TableName )
BEGIN
SELECT TOP 1 ID, Name FROM TableName
END
ELSE
BEGIN
--exists returned no rows
--send a default row
SELECT 0, ''
END
-121--4648443- Если требуется несколько раз, можно записать расширение в Перечислитель
.
class Enumerator
def enum_drop(n)
with_index do |val, idx|
next if n == idx
yield val
end
end
end
File.open(testfile).each_line.enum_drop(1) do |line|
print line
end
# prints lines #1, #3, #4, …
Это немного аккуратнее:
File.open(fname).each_line.with_index do |line, lineno|
next if lineno == 0
# ...
end
или
io = File.open(fname)
# discard the first line
io.gets
# process the rest of the file
io.each_line {|line| ...}
io.close
С верхней части моей головы, но я уверен, что с некоторыми дополнительными исследованиями есть более элегантный способ
File.open( filename ).each_line.to_a[1..-1].each{ |line|... }
Хорошо, поцарапайте это... немного исследований и это может быть лучше
File.open( filename ).each_line.with_index.drop_while{ |line,index| index == 0 }.each{ |line, index| ... }
Теперь, когда вы получили разумные ответы, вот совершенно другой способ справиться с этим.
class ProcStack
def initialize(&default)
@block = default
end
def push(&action)
prev = @block
@block = lambda do |*args|
@block = prev
action[*args]
end
self
end
def to_proc
lambda { |*args| @block[*args] }
end
end
#...
process_lines = ProcStack.new do |line, index|
puts "processing line #{index} => #{line}"
end.push do |line, index|
puts "skipping line #{index} => #{line}"
end
File.foreach(filename).each_with_index(&process_lines)
Это ни идиоматично, ни ужасно интуитивно с первого раза, но это весело!
Сомневаюсь, что это идиоматика, но все просто.
f = File.open(filename)
f.readline
f.each_line do |x|
#...
end