2016-04-11 2 views
-1

Ich möchte eine Datei nehmen, lesen Sie die Datei in mein Programm und teilen Sie es in Zeichen teilen Sie das resultierende Zeichen-Array in ein multidimensionales Array von Jeweils 5.000 Zeichen, dann schreibe jedes separate Array in eine Datei am selben Ort.Wie schreibe ich ein mehrdimensionales Array in separate Dateien und lesen Sie dann in der Reihenfolge in Ruby

Ich habe eine Datei genommen, gelesen und erstellt das mehrdimensionale Array. Jetzt möchte ich jedes einzelne Single-Dimension-Array in separate Dateien schreiben.

Die Datei wird über Benutzereingabe abgerufen. Dann habe ich eine chain-helper-Methode erstellt, die die Datei im ersten Mix in ein Array speichert, diese wird dann an eine andere Methode übergeben, die sie in ein multidimensionales Array zerlegt, das sie schließlich an das Ende der Kette weitergibt, die gerade eingerichtet ist um ein neues Verzeichnis zu erstellen, für das ich diese Dateien anlegen werde.

require 'Benchmark/ips' 

file = "C:\\test.php" 
class String 
    def file_to_array 
    file = self 
    return_file = File.open(file) do |line| 
     line.each_char.to_a 
    end 
    return return_file 
    end 
    def file_write 
    file_to_write = self 
    if Dir.exist?("I:\\file_to_array") 
     File.open("I:/file_to_array/tmp.txt", "w") { |file| file.write(file_to_write) } 
     read_file = File.read("I:/file_to_array/tmp.txt") 
    else 
     Dir.mkdir("I:\\file_to_array") 
    end 
    end 
end 

class Array 
    def file_divider 
    file_to_divide = self 
    file_to_separate = [] 
    count = 0 
    while count != file_to_divide.length 
     separator = count % 5000 
     if separator == 0 
     start = count - 5000 
     stop = count 
     file_to_separate << file_to_divide[start..stop] 
     end 
     count = count + 1 
    end 
    return file_to_separate 
    end 
    def file_write 
    file_to_write = self 
    if Dir.exist?("I:\\file_to_array") 
     File.open("I:/file_to_array/tmp.txt", "w") { |file| file.write(file_to_write) } 
    else 
     Dir.mkdir("I:\\file_to_array") 
    end 
    end 
end 
Benchmark.ips do |result| 
    result.report { file.file_to_array.file_divider.file_write } 
end 

test.php

<?php 
echo "hello world" 
?> 
+0

Ich würde vorschlagen, die Kernklassen nicht zu monkeyen. Haben Sie einfach eine Klasse, die Ihre Geschäftslogik kapselt. Es würde Ihren Code lesbarer machen. Auch "String" in Ruby kann bereits als Array behandelt werden. Also, teilen Sie Ihre Zeichenfolge aus der Datei in Strings von 5000 Zeichen und schreiben Sie sie in eine Datei wie unten gezeigt. – Uzbekjon

+0

Würde das Einfügen in eine Klasse die Fehler "String and Array Handling" verhindern? –

+0

Ich habe die Frage nicht verstanden. Ihr Code kann mit Fehlern umgehen, richtig? – Uzbekjon

Antwort

1

Dieser ungetesteten Code ist, wo ich Text in Stücke beginnen würde und es zu spalten sparen:

str = "I want to take a file" 

str_array = str.scan(/.{1,10}/) # => ["I want to ", "take a fil", "e"] 

str_array.each.with_index(1) do |str_chunk, i| 
    File.write("output#{i}", str_chunk) 
end 

Dies gilt nicht Wort-Grenzen zu ehren.

Das Lesen einer separaten Eingabedatei ist einfach; Sie können read verwenden, wenn Sie wissen, dass die Eingabe niemals den verfügbaren Speicher überschreitet und Sie nicht auf die Leistung achten.

darüber nachdachte weiter, wenn Sie eine Textdatei lesen möchten und seinen Inhalt in kleinere Dateien zu brechen, dann ist es in Stücke lesen:

input = File.open('input.txt', 'r') 
i = 1 
until input.eof? do 
    chunk = input.read(10) 
    File.write("output#{i}", chunk) 
    i += 1 
end 
input.close 

Oder noch besser, weil es automatisch die Eingabe schließt:

File.open('input.txt', 'r') do |input| 
    i = 1 
    until input.eof? do 
    chunk = File.read(10) 
    File.write("output#{i}", chunk) 
    i += 1 
    end 
end 

Die sind nicht getestet, aber es sieht ungefähr richtig aus.

+0

Jetzt ist das unglaublich nützlich. –

+0

Ich müsste nur den regulären Ausdruck verwenden, um die Wortgrenzen zu erfassen. Ich hatte nicht daran gedacht, es so zu machen. –

0

Verwenden Standard File API und Serialisation.

File.write('path/to/yourfile.txt', Marshal.dump([1, 2, 3])) 
+0

Ich habe den Code hinzugefügt, um zu demonstrieren, was passiert. –

Verwandte Themen