1

私のアプリケーションは、ユーザーからアップロードされたファイルを受け入れて解析し、シーク メソッドと巻き戻しメソッドをかなり頻繁に使用して、ファイルからブロックを解析します (行は、データのセクションを囲むために「開始」または「終了」で開始できます)。

新しい要件により、ユーザーは暗号化されたファイルをアップロードできます。ファイルのコンテンツの復号化を実装し、コンテンツ文字列を既存のメソッドに返します。文字列を CSV として解析できますが、ファイル コントロールが失われます。

ビジネス上の理由から、暗号化されていないバージョンのファイルを保存することはできません。

私は FasterCSV を使用していますが、シーク/巻き戻しの動作を維持できる場合は、他のものを使用することを嫌いません。

現在のコード:

FasterCSV.open(path, 'rb') do |csv| # Can I open a string as if it were a file?
  unless csv.eof? # Catch empty files
    # Read, store position, seek, rewind all used during parsing
    position = csv.pos
    row = csv.readline 
    csv.seek(pos)
4

2 に答える 2

0

StringIO掘り下げて実験した後、次のようにクラスを使用して IO メソッドを保持できることがわかりました。

csv = StringIO.new(decrypted_content)
unless csv.nil?
  unless csv.eof? # Catch empty files
    position = csv.pos
    row = csv.readline.chomp.split(',')
    csv.seek(pos)

csv 行のように使用できるように行を手動で分割する必要があるのは変更だけであり、余分な作業は必要ありません。

于 2013-06-07T09:10:36.393 に答える
0

CSV gem はもう必要ありませんが、シーク/巻き戻しの動作を好む場合は、文字列に対して独自のロールを作成できます。次のようなものがシナリオで機能する可能性があります。

array_of_lines=unecrypted_file_string.split('\n')
array_of_lines.each_with_index do |line,index|
    position=index
    row=line
    seek=line[10]
end
于 2013-05-29T14:10:59.573 に答える