我需要做简单的文件操作。从一个txt文件中获取数据并以csv格式保存。我的正则表达式是获取所有数据并将其保存在数组中,但是当我尝试连接数组元素并将其发布到文件中时,它会做一些奇怪的事情。
调试变量the_line
并通过puts the_line
打印时,结果为
AN.A-1437/2014 z dnia 2014.04.03
3706
DEZ 1380/2014
Obrót
Wolny rynek
Osoba fizyczna
Osoba fizyczna
334 650.00 zł
niezabudowana przeznaczona pod zabudowę inną niż
WA1L/00022800/1
8 - RAJSZEW
42/2014
9/18
2231 ( LzVI 1402 RVI 829)
但是当我运行out_file.puts(the_line.join(','))
时,生成的文件看起来像这样
AN.A-1437/2014 z dnia 2014.04.03
,3706
,DEZ 1380/2014
,Obrót
,Wolny rynek
,Osoba fizyczna
,Osoba fizyczna
,334 650.00 zł
,niezabudowana przeznaczona pod zabudowę inną niż
,WA1L/00022800/1
,8 - RAJSZEW
,42/2014
,9/18
,2231 ( LzVI 1402 RVI 829)
,Tereny zabudowy usługowej
,Własność
,1/1
这对我来说很奇怪。当我运行test.rb
并手动创建数组并将其保存到文件时,它可以正常工作。所以我想这与我如何创建数组有关。但是什么?
这是完整的代码:
out_file = File.open('files/out.csv', 'w')
in_file = File.open('files/in.txt')
first_plot = true
the_line = []
n = 0
in_file.each do |line|
n += 1
#the ===== line suggests it's time to save the line and start filling the second one. This is were I have problems somehow
if line =~ /=+/
out_file.puts(the_line.join(','))
the_line = []
first_plot = true
#This is because every transaction can have several plots and I have to start new line as well. I know this needs refractoring.
elsif line=~ /Numer/
if !(first_plot)
if line =~ /:\d+\/*\d*$/
out_file.puts the_line.join(',')
13.times { |i| the_line << '' }
elsif line=~/:\d+\/*\d*;\d+$/
out_file.puts the_line.join(',')
19.times { |i| the_line << ''}
elsif line=~/:\d+\/*\d*;\d+,\d+$/
out_file.puts the_line.join(',')
30.times { |i| the_line << ''}
end
else
#this is the first time the plot is seen so we can have it in one line with transaction details
first_plot = false
m = /:(\S.*)$/.match(line)
the_line << $1
end
#This is for every normal value
elsif line=~/:(\S.*)$/
the_line << $1
else
if line =~ /[a-zA-Z]+ :\s+$/
else
puts "#{n}: Error: #{line}"
end
end
end
out_file.close
in_file.close
这是我需要操作的示例文件(我想在以后提取值:基本上)
Dokument :AN.A-1437/2014 z dnia 2014.04.03
IRCW :3706
Opis :DEZ 1380/2014
Rodzaj zapisu :Obrót
Forma obrotu :Wolny rynek
Strona sprzedająca :Osoba fizyczna
Strona kupująca :Osoba fizyczna
Wartość :334 650.00 zł
Nieruchomość :niezabudowana przeznaczona pod zabudowę inną niż
zagrodowa
Księga wieczysta :WA1L/00022800/1
Obręb :8 - RAJSZEW
Nr zmiany :42/2014
Działki :
Numer :9/18
Powierzchnia :2231 ( LzVI 1402 RVI 829)
Funkcja dominująca :Tereny zabudowy usługowej
Rodzaj prawa :Własność
Udział w prawie :1/1
====================================================================== :
Dokument :AN.A-4778/2014 z dnia 2014.03.03
IRCW :3705
Opis :DEZ 1352/2014
Rodzaj zapisu :Obrót
Forma obrotu :Wolny rynek
Strona sprzedająca :Osoba fizyczna
Strona kupująca :Osoba fizyczna
Wartość :235 000.00 zł
Nieruchomość :lokalowa
Księga wieczysta :WA1L/00035911/6
Obręb :1 - JABŁONNA
Nr zmiany :767/2014
Działki :
Numer :2273
Powierzchnia :2187 ( B 2187)
Funkcja dominująca :brak danych
Rodzaj prawa :Własność
Udział w prawie :1/1
Budynki :
Numer :2273;1
Funkcja podstawowa :Mieszkalne
Rok zak. budowy :2002
Pow. użytkowa :2435
Pow. zabudowy :1242
Liczba kond. :3
Liczba lokali :45
Rodzaj prawa :Własność
Udział w prawie :1/1
adres(y) :JABŁONNA; LEŚNA 17b
Lokale :
Numer :2273;1,14
Funkcja podstawowa :Mieszkalne
Liczba izb :3
Kondygnacja :1
Powierzchnia użytkowa :50.23
Rodzaj prawa :Własność
Udział w prawie :1/1
adres(y) :JABŁONNA; LEŚNA 17b
====================================================================== :
Dokument :AN.A-5028/2014 z dnia 2014.05.05
IRCW :3704
Opis :DEZ 1348/2014
Rodzaj zapisu :Obrót
Forma obrotu :Wolny rynek
Strona sprzedająca :Osoba fizyczna
Strona kupująca :Osoba fizyczna
Wartość :220 000.00 zł
Nieruchomość :niezabudowana przeznaczona pod zabudowę inną niż
zagrodowa
Księga wieczysta :WA1L/00044622/9
Obręb :1 - JABŁONNA
Nr zmiany :765/2014
Działki :
Numer :2759
Powierzchnia :1283 ( RIVb 1283)
Funkcja dominująca :Tereny zabudowy usługowej
Rodzaj prawa :Współwłasność
Udział w prawie :1/2
Numer :54/25
Powierzchnia :1909 ( RIVb 540 RV 1369)
Funkcja dominująca :brak danych
Rodzaj prawa :Własność
Udział w prawie :1/1
Numer :54/26
Powierzchnia :2994 ( RV 1318 RIVb 1676)
Funkcja dominująca :brak danych
Rodzaj prawa :Własność
Udział w prawie :1/1
====================================================================== :
答案 0 :(得分:1)
AS @MarkThomas指出.map(&:chomp).join(',')
将清理新的行字符,但你也可以使用readlines("\n")
,你的代码可能会被清理一些,可能是这样的:(虽然这个代码也是重构更多)
def pad_the_line(padding)
@the_line.concat([''] * padding)
end
def append_to_output
@out_file << @the_line.map(&:chomp).join(",")
end
def set_padding(line)
if line =~ /:\d+\/*\d*$/
13
elsif line=~/:\d+\/*\d*;\d+$/
19
elsif line=~/:\d+\/*\d*;\d+,\d+$/
30
else
0
end
end
def process_file(in_file='files/in.txt',out_file='files/out.csv')
@out_file = File.open(out_file, 'w')
first_plot = true
@the_line = []
File.open(in_file).readlines("\n").each_with_index do |line,index|
#the ===== line suggests it's time to save the line and start filling the second one. This is were I have problems somehow
if line =~ /=+/
append_to_output
@the_line.clear
first_plot = true
#This is because every transaction can have several plots and I have to start new line as well. I know this needs refractoring.
elsif line=~ /Numer/
if !(first_plot)
append_to_output
pad_the_line(set_padding(line))
else
#this is the first time the plot is seen so we can have it in one line with transaction details
first_plot = false
m = /:(\S.*)$/.match(line)
@the_line << $1
end
#This is for every normal value
elsif line=~/:(\S.*)$/
@the_line << $1
else
#you could also raise if needed
warn "WARNING:: #{index + 1}: Error: #{line}" unless line =~ /[a-zA-Z]+ :\s+$/
end
end
@out_file.close
end
注意当我针对你的文件运行时,我得到以下输出
WARNING:: 9: Error:
WARNING:: 11: Error: zagrodowa
WARNING:: 30: Error:
WARNING:: 70: Error:
WARNING:: 72: Error: zagrodowa
和像这样的输出文件
AN.A-1437/2014 z dnia 2014.04.03,3706,DEZ 1380/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,334 650.00 zł,niezabudowana przeznaczona pod zabudowę inną niż ,WA1L/00022800/1,8 - RAJSZEW,42/2014,9/18,2231 ( LzVI 1402 RVI 829),Tereny zabudowy usługowej,Własność,1/1AN.A-4778/2014 z dnia 2014.03.03,3705,DEZ 1352/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,235 000.00 zł,lokalowa,WA1L/00035911/6,1 - JABŁONNA,767/2014,2273,2187 ( B 2187),brak danych,Własność,1/1AN.A-4778/2014 z dnia 2014.03.03,3705,DEZ 1352/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,235 000.00 zł,lokalowa,WA1L/00035911/6,1 - JABŁONNA,767/2014,2273,2187 ( B 2187),brak danych,Własność,1/1,,,,,,,,,,,,,,,,,,,,Mieszkalne,2002,2435,1242,3,45,Własność,1/1,JABŁONNA; LEŚNA 17bAN.A-4778/2014 z dnia 2014.03.03,3705,DEZ 1352/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,235 000.00 zł,lokalowa,WA1L/00035911/6,1 - JABŁONNA,767/2014,2273,2187 ( B 2187),brak danych,Własność,1/1,,,,,,,,,,,,,,,,,,,,Mieszkalne,2002,2435,1242,3,45,Własność,1/1,JABŁONNA; LEŚNA 17b,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Mieszkalne,3,1,50.23 ,Własność,1/1,JABŁONNA; LEŚNA 17bAN.A-5028/2014 z dnia 2014.05.05,3704,DEZ 1348/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,220 000.00 zł,niezabudowana przeznaczona pod zabudowę inną niż ,WA1L/00044622/9,1 - JABŁONNA,765/2014,2759,1283 ( RIVb 1283),Tereny zabudowy usługowej,Współwłasność,1/2AN.A-5028/2014 z dnia 2014.05.05,3704,DEZ 1348/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,220 000.00 zł,niezabudowana przeznaczona pod zabudowę inną niż ,WA1L/00044622/9,1 - JABŁONNA,765/2014,2759,1283 ( RIVb 1283),Tereny zabudowy usługowej,Współwłasność,1/2,,,,,,,,,,,,,,1909 ( RIVb 540 RV 1369),brak danych,Własność,1/1AN.A-5028/2014 z dnia 2014.05.05,3704,DEZ 1348/2014,Obrót,Wolny rynek,Osoba fizyczna,Osoba fizyczna,220 000.00 zł,niezabudowana przeznaczona pod zabudowę inną niż ,WA1L/00044622/9,1 - JABŁONNA,765/2014,2759,1283 ( RIVb 1283),Tereny zabudowy usługowej,Współwłasność,1/2,,,,,,,,,,,,,,1909 ( RIVb 540 RV 1369),brak danych,Własność,1/1,,,,,,,,,,,,,,2994 ( RV 1318 RIVb 1676),brak danych,Własność,1/1