[Newbie Alert] Probably missing something simple here ... help {wimper}

(B. Angell) #1

Am trying to read from a file and write to a number of files based on the first 4 letters of the data line. Therefore, I want to be able to write the line: A0037775830|lkajsdlkfjsaljf;lsakjfdsa;jf to file A003 *and* append all of the A003 lines as well. Here is the hack I have below, however, produces errors and I know I am missing something simple/easy ..... as follows:

#!/usr/bin/ruby -w
File.open("meshdata.txt") do |file|
while line = file.gets
a = line
b = a[0,4]
  File.open(b,"w") do |afile|
   puts a.afile

  end
end
end

Any/all help in this matter is greatly appreciated.

-Bob-

(Ben Giddings) #2

Am trying to read from a file and write to a number of files based on
the first 4 letters of the data line. Therefore, I want to be able to
write the line: A0037775830|lkajsdlkfjsaljf;lsakjfdsa;jf to file A003
*and* append all of the A003 lines as well. Here is the hack I have
below, however, produces errors and I know I am missing something
simple/easy ..... as follows:

#!/usr/bin/ruby -w
File.open("meshdata.txt") do |file|
while line = file.gets
a = line
b = a[0,4]
  File.open(b,"w") do |afile|
   puts a.afile

      afile.puts a

  end
end
end

Ben

···

On Tuesday 16 August 2005 16:42, B. Angell wrote:

(W. James) #3

B. Angell wrote:

Am trying to read from a file and write to a number of files based on
the first 4 letters of the data line. Therefore, I want to be able to
write the line: A0037775830|lkajsdlkfjsaljf;lsakjfdsa;jf to file A003
*and* append all of the A003 lines as well. Here is the hack I have
below, however, produces errors and I know I am missing something
simple/easy ..... as follows:

#!/usr/bin/ruby -w
File.open("meshdata.txt") do |file|
while line = file.gets
a = line
b = a[0,4]
  File.open(b,"w") do |afile|
   puts a.afile

  end
end
end

You are repeatedly opening a file that is already open.
Each time you do that, you lose what you have already written.

outfilename = ""; outfile = nil
File.open("meshdata.txt") do |file|
  while line = file.gets
    b = line[0,4]
    if b != outfilename
      outfile.close if outfile
      outfilename = b
      outfile = File.open(outfilename,"w")
    end
    outfile.puts line
  end
end
outfile.close if outfile

(Wilson Bilkovich) #4

I'm at the end of a long day here, and I haven't bothered to try to
understand your goals/requirements/etc, so forgive me if this is just
a senseless babble. However, here's what comes to mind:

#!/usr/bin/ruby -w
File.open("meshdata.txt").each_line do |line|
thingy = line[0,4]
File.open(thingy,"a+") do |new_file|
  new_file.puts line
end
end

If your input file is hooooj, you would probably want to sort it
first, to minimize the number of times you open and close files.

···

On 8/16/05, B. Angell <lists@activepipes.com> wrote:

Am trying to read from a file and write to a number of files based on
the first 4 letters of the data line. Therefore, I want to be able to
write the line: A0037775830|lkajsdlkfjsaljf;lsakjfdsa;jf to file A003
*and* append all of the A003 lines as well. Here is the hack I have
below, however, produces errors and I know I am missing something
simple/easy ..... as follows:

#!/usr/bin/ruby -w
File.open("meshdata.txt") do |file|
while line = file.gets
a = line
b = a[0,4]
  File.open(b,"w") do |afile|
   puts a.afile

  end
end
end

(W. James) #5

Wilson Bilkovich wrote:

···

On 8/16/05, B. Angell <lists@activepipes.com> wrote:
> Am trying to read from a file and write to a number of files based on
> the first 4 letters of the data line. Therefore, I want to be able to
> write the line: A0037775830|lkajsdlkfjsaljf;lsakjfdsa;jf to file A003
> *and* append all of the A003 lines as well. Here is the hack I have
> below, however, produces errors and I know I am missing something
> simple/easy ..... as follows:
>
> #!/usr/bin/ruby -w
> File.open("meshdata.txt") do |file|
> while line = file.gets
> a = line
> b = a[0,4]
> File.open(b,"w") do |afile|
> puts a.afile
>
> end
> end
> end

I'm at the end of a long day here, and I haven't bothered to try to
understand your goals/requirements/etc, so forgive me if this is just
a senseless babble. However, here's what comes to mind:

#!/usr/bin/ruby -w
File.open("meshdata.txt").each_line do |line|
thingy = line[0,4]
File.open(thingy,"a+") do |new_file|
  new_file.puts line
end
end

If your input file is hooooj, you would probably want to sort it
first, to minimize the number of times you open and close files.

Doesn't this open and close a file every time a line is
read from meshdata.txt, even if that file is sorted?