Ruby Net::FTP gettextfile无法在本地保存文件
我正在尝试从ftp站点检索文件(.csv),并将它们全部保存在本地同一文件夹中。我的代码如下所示:Ruby Net::FTP gettextfile无法在本地保存文件,ruby,net-ftp,Ruby,Net Ftp,我正在尝试从ftp站点检索文件(.csv),并将它们全部保存在本地同一文件夹中。我的代码如下所示: #! /usr/bin/ruby require 'logger' require 'fileutils' require 'net/ftp' require 'rubygems' require 'mysql2' require 'roo' require 'date' # logging setup log = Logger.new("/path_to_logs/ftp_log.log",
#! /usr/bin/ruby
require 'logger'
require 'fileutils'
require 'net/ftp'
require 'rubygems'
require 'mysql2'
require 'roo'
require 'date'
# logging setup
log = Logger.new("/path_to_logs/ftp_log.log", 10, 1024000)
log.level = Logger::INFO
export_ftp_path = '/Receive/results/'
export_work_path ='/Users/pierce/results_exports/'
Net::FTP.open('host', 'username', 'password') do |ftp|
log.info("Logged into FTP")
ftp.passive = true
ftp.chdir("#{export_ftp_path}")
ftp.list.each do |file|
log.info("Found file #{file}")
new_file = file[56..115] #take part of the file name and remove spaces and periods
new_file = new_file.gsub(/[.]+/, "")
new_file = new_file.gsub(/\s/, "0")
ftp.gettextfile(file,"#{new_file}")
log.info("Downloaded file #{new_file}")
end
end
以下是我收到的错误:
/Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `initialize': No such file or directory - (Errno::ENOENT)
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `open'
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `gettextfile'
from ftp_test.rb:44:in `block (2 levels) in <main>'
from ftp_test.rb:33:in `each'
from ftp_test.rb:33:in `block in <main>'
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:116:in `open'
关于如何在gettextfile中或在我的脚本中更改以正确保存文件的建议?当您只需要目录中的文件列表时,应该使用而不是列表。list
的输出需要正确解析,否则
当您请求文件时,它必须是原始文件名,包括所有空格。保存文件时,它可以是您想要的任何内容(包括空格或非空格)。错误是因为您请求了错误的文件。在您的案例中使用nlst
。这将使下载变得更容易(无需转换或解析)。您至少需要从修复正在下载的文件开始。它应该是ftp.gettextfile(“#{file}”,“#{new_file}”)
。您不能将new\u文件
作为源名称。谢谢您的建议。我做了更改,得到了与上面第一条错误消息相同的错误。任何其他建议。只ftp.gettextfile(文件,“testfile”)
怎么样。在使用新文件之前,您还应该调试(打印)新文件的内容。@Casper我对我的问题做了一些编辑,并尝试了您建议的方向。但是,我收到一个“没有这样的文件或目录”错误。我认为这与文件名中的额外空格有关,这就是为什么我要删除它们并创建一个新变量。我在问题中添加了这些变量的实际值。看起来它返回了一个好的文件名。但是,。和。。gettextfile无法处理文件。如何从返回的嵌套数组中消除它们?@analyticsPierce-有很多方法。您可以将其添加到循环的第一行,例如:next if file.match(/^\.\.?$/)
。如果文件是
或,这将导致循环跳转到下一个元素。
。或者如果你喜欢更详细的代码:next if file==“|| file==”。“
。很好,很完美。非常感谢你的帮助,我从中学到了很多。
file = -rwxr-xr-x 1 1130419 114727 9546 May 17 08:11 results_Wed. 16 May 2012.csv
new_file = results_Wed0230May02012csv