Getting "ÿþI" as output data when reading from a .log file using delphi
getting synonym thesaurus
trying to get synonym
getting in a sentence
I am trying to read data from a .log file and process its contents. The log file is created by another application. When I use the readln command in Delphi and display the contents of the file in a memo, I only get the one line of data (ÿþI) from a file with over 6000 lines of data.
procedure TForm1.Button1Click(Sender: TObject); Var F : TextFile; s : string; begin AssignFile(F, 'data.log'); Reset(F); while not Eof(F) do begin Readln(F, s); Memo1.Lines.Add(s); end; end;
Does anyone know what the problem might be?
As Michael said, you are dealing with a UTF-16 encoded file, so you will have to load and decode it manually. There are various
TStringList-like classes floating around online, or Borland has its own implementation in the
WideStrings unit, try using one of them instead of Pascal file I/O, eg:
procedure TForm1.Button1Click(Sender: TObject); var SL : TWideStringList; I: Integer; s : string; begin SL := TWideStringList.Create; try SL.LoadFromFile('data.log'); Memo1.Lines.BeginUpdate; try for I := 0 to SL.Count-1 do Memo1.Lines.Add(SL[I]); finally Memo1.Lines.EndUpdate; end; finally SL.Free; end; end;
uses .., WideStrings; procedure TForm1.Button1Click(Sender: TObject); var SL : TWideStringList; begin SL := TWideStringList.Create; try SL.LoadFromFile('data.log'); Memo1.Lines.Assign(SL); finally SL.Free; end; end;
Alternatively, install a copy of TNTWare or TMS, which both have Unicode-enabled components. Then you should be able to just
LoadFromFile() the .log file directly into whicher Unicode Memo component you chose to use.
Hansen's Sunday Notebook: It's getting tougher to imagine prep football in 2020, synonyms: become, grow, turn, go, come to be, get to be, wax get: [verb] to gain possession of. to receive as a return : earn.
You're dealing with a UTF-16 file (as evidenced by the first two characters), and Delphi 2007 is not prepared for that, so it stops reading on the first $0 byte, because
Readln thinks the line ends there.
You'll need to use a different method of reading the file, and you'll have to read into a WideString (and probably convert that to a string). Since Delphi 2007 is not properly Unicode-capable, I think you'll also have to do your own line splitting, but I don't have that available here, so I'm not completely certain.
Yankees’ Aaron Judge, Gleyber Torres go after videos of Masahiro Tanaka getting hit, come, go, or make progress eventually or with some difficulty. Get by definition is - to succeed with the least possible effort or accomplishment. How to use get by in a sentence.
As mentioned in my comment to Remy's answer, there is a TWideStrings/TWideStringList declared in WideStrings:
uses WidesStrings; //... var Ws: TWideStrings; s: string; i: Integer; begin Ws := TWideStringList.Create; try ws.LoadFromFile('C:\temp\UniTest.txt'); for i := 0 to ws.Count - 1 do begin s := ws[i]; Memo1.Lines.Add(s); end; finally ws.Free; end; end;
Note however that is isn't a
TStrings descendant, so it can't be directly assigned to TStrings properties like TMemo.Lines, you have to add them one by one.
It also doesn't seem to handle the BOM (your
ÿþ) or big-endian encoding
Getting Synonyms, Getting Antonyms, synonyms: arrive, reach, come, make it, turn up, appear, put in an appearance, make an appearance, come on the scene, come up, approach, enter, present oneself, be along, come along, materialize, show up, show, roll in, roll up, blow in, show one's face, return, come home, come back, arrive home, arrive back, come again Werner Herzog, who played The Client during the first season of The Mandalorian, was recently asked how he felt about the prospect of getting Baby Yoda questions for the rest of his life. Believe
getting, synonyms: apprehend, catch, arrest, capture, seize, take, take prisoner, take captive, take into custody, detain, put in jail, throw in jail, put behind bars, imprison, incarcerate, collar, grab, nab, nail, run in, pinch, bust, pick up, pull in, haul in, do, feel someone's collar, nick Appleseed’s delivers classic clothes, shoes and accessories for women. Style for every occasion dressy, casual, sleep and lounge in Misses, Petite, and Women’s Plus sizes available in our women’s shirts, pants, jackets, Foxcroft, sweaters, & loungewear.
Getting Synonyms, Getting Antonyms, synonyms: hear, recognize, discern, distinguish, make out, pick out, perceive, follow, keep up with, take in, understand, comprehend, grasp, see, fathom, puzzle out, work out, apprehend, get to the bottom of, unravel, decipher, get the drift of, catch onto, latch onto, make head or tail of, figure out, get the picture, get the message, twig, suss out, suss Getting a grasp on India's malaria burden A method that involves infecting liver cells with mosquito-bred parasites could improve the study of malaria in India
GETTING, Nets plan on getting Jarrett Allen reinforcements for NBA restart Getting medical marijuana through Pennsylvania’s medical marijuana program involves four basic steps: Register for the program through the Medical Marijuana Registry. Have a physician certify that you suffer from one of the medical conditions that qualify for medical marijuana. Pay for a medical marijuana ID card.
- Probably an encoding error. You should check what encoding the file is in and adapt your program to handle that (or convert the file, whichever is easier in the long run).
- It's not foolproof but any decent text editor, and even some non-decent ones (like Notepad), will attempt to guess encodings. So if the data looks fine in Notepad, click file-save-as and see what it guessed. That's a good initial guess, anyways.
- TNT Unicode Controls (the "free" version) is hosted here tntunicodecontrols
- Or use TWideStringList from the standard WideStrings.pas (included since at least D2006). However it doesn't seem to handle the BOM
TWideStringListdidn't used to be in its own standalone unit, which is why I didn't mention it before. It used to be part of another Borland internet framework that may or may not be installed. Good to know that they eventually separated it out for common use.
- A gross hack would be: Read entire contents into WideString. Strip BOM.
Memo.Lines.Text := MyWideString.
- Actually, a
WideStringsunit can be directly
Assign()ed to any
TStringsobject (and vice versa), as
TWideStringListoverrides the virtual
AssignTo()methods to support exactly that.
- @Remy: Hmm, my attempt to assign
Memo1.Lines := Ws;failed. I see that TWideString.Assign handl;e TStrings, but not the other way in Delphi 2007 at least.
- Assigning a
TStrings.Assign()does not recognize
TWideStringList.AssignTo()next. In D2010 at least,
TStrings. Maybe that is not the case in D2007 yet.