Solved

Parse text file, trim each line, remove carriage returns, add CRLF after delimiter character?

Posted on 2007-12-04
6
7,655 Views
Last Modified: 2013-11-07
I believe this is a fairly simple question, but unfortunately I have no experience working with text files so I'm asking for help rather than figuring it out myself.

I need to read in a text file (it's going to be 5 megs up to a couple hundred).

I need to do the following with it
1) I need to remove the trailing spaces from each line.
2) Delete all carriage returns and line feeds.
3) Add a Carriage Return/ Line Feed after any instance of "</END??>" where the ?? can be anything.

I believe each line is around 1000 bytes.  Speed doesn't really matter.
I mention the byte count since I think this is a large file and should use something like a string buffer no? Not really familiar with anything other than ordinary strings.

I'll gladly bump up the point value for a quick quality solution.
0
Comment
Question by:Brothernod
  • 3
  • 2
6 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
let's assume you read each line into a String object:
       Dim line as String

To remove new lines and CRs, use:
       line = line.Replace(chr(10).ToString(), "")
       line = line.Replace(char(13).ToString(), "")

Then remove trailing spaces
       line = line.TrimEnd(null);

about the </END??> issue, you can do it with an algorithm:
      Dim i as Integer = 0
      Do
             i = line.IndexOf("</END", i)
             If i < 0 Then Exit Do
             i = line.IndexOf(">", i)
             If i < 0 Then Exit Do
             line = line.Insert(i+1, char(13) & chr(10))
      While True
0
 
LVL 19

Expert Comment

by:weellio
Comment Utility
here ya go
Dim source, target

source = "myfile.txt"

target = "myfile2.txt"
 

Dim fso, f, f2

dim x, y

Const ForReading = 1, ForWriting = 2
 

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(source) Then

   Dim inputLine, outputLine

   Set f = fso.OpenTextFile(source, ForReading, False)

   Set f2 = fso.OpenTextFile(target, ForWriting, True)

   While Not f.AtEndOfStream

      inputLine = f.ReadLine

			outputline = parseme(inputLine)

      f2.Write outputline

   Wend

   f.Close

   f2.Close

   Set f2 = Nothing

   Set f = Nothing

   MsgBox "Done"

Else

   MsgBox source, vbOKOnly, "Source File Not Found"

End If

Set fso = Nothing
 

function parseme(strtext)

' remove trailing lines

	parseme = rtrim(strtext)
 

'remove carriage returns

	parseme = Replace(parseme, vbCr, "")
 

'remove line feeds

	parseme = Replace(parseme, vblf, "")
 

'find "</END??>" and add vbcrlf

	x = instr(parseme, "</END") 'if exists find a location 

'loop to find multiple '</end"'s

	do until x = 0 

			y = instr(x, parseme, ">")

			parseme = left(parseme, y+1) & vbcrlf & mid(parseme, y+1) 'starting on character past the ">"

			x = instr(y, parseme, "</END") 

	loop

end function

Open in new window

0
 
LVL 19

Expert Comment

by:weellio
Comment Utility
hmm,.. i did a simple vbscript,.. but i'm sure you don't really have to change it to make it work with vb

just name the file something.vbs and edit the 'inputfile and outputfilenames.
or setup as arguments or something.
0
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 19

Accepted Solution

by:
weellio earned 250 total points
Comment Utility
tiny change
Dim source, target

source = "myfile.txt"

target = "myfile2.txt"
 

Dim fso, f, f2

dim x, y

Const ForReading = 1, ForWriting = 2
 

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(source) Then

   Dim inputLine, outputLine

   Set f = fso.OpenTextFile(source, ForReading, False)

   Set f2 = fso.OpenTextFile(target, ForWriting, True)

   While Not f.AtEndOfStream

      inputLine = f.ReadLine

			outputline = parseme(inputLine)

      f2.Write outputline

   Wend

   f.Close

   f2.Close

   Set f2 = Nothing

   Set f = Nothing

   MsgBox "Done"

Else

   MsgBox source, vbOKOnly, "Source File Not Found"

End If

Set fso = Nothing
 

function parseme(strtext)

' remove trailing lines

	parseme = rtrim(strtext)
 

'remove carriage returns

	parseme = Replace(parseme, vbCr, "")
 

'remove line feeds

	parseme = Replace(parseme, vblf, "")
 

'find "</END??>" and add vbcrlf

	x = instr(parseme, "</END") 'if exists find a location 

'loop to find multiple '</end"'s

	do until x = 0 

			y = instr(x, parseme, ">")

			parseme = left(parseme, y) & vbcrlf & mid(parseme, y+1) 'starting on character past the ">"

			x = instr(y, parseme, "</END") 

	loop

end function

Open in new window

0
 
LVL 1

Author Comment

by:Brothernod
Comment Utility
I won't lie, I was really hoping for a nice clean vb.net example.

BUT

I needed this quick, and weelio did provide a quick complete solution.

Thank you.
0
 
LVL 1

Author Closing Comment

by:Brothernod
Comment Utility
It's in VBA not VB.NET but I guess it was close enough since I'm in a hurry :)
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Suggested Solutions

Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
This video discusses moving either the default database or any database to a new volume.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now