You are currently offline, waiting for your internet to reconnect

INFO: Appending from a Delimited ASCII File Using Low-Level I/O

This article was previously published under Q115418
This article has been archived. It is offered "as is" and will no longer be updated.
When you are importing data from other applications into FoxPro, adelimited ASCII file is often used. However, if any of the data columnsfrom the original database extend beyond 255 characters, any text beyondthis point will be cut off. Text longer than 255 characters should bestored in a FoxPro memo field. However, the APPEND FROM command does notmove data into memo fields.

To work around this behavior, you can use the low-level file I/O functionsin FoxPro to programmatically move the data from the text file into thedatabase including the memo field. A sample program for doing this isprovided below.
The program below is provided as an example of a FoxPro program thatemploys low-level file I/O to append data from a delimited text file intocharacter and memo fields. For purposes of this article, the input textfile contains three character fields. The third field is to be placed in amemo field and might contain embedded carriage returns.

A sample delimited text file might be constructed as follows:
   "FRED","FLINTSTONE","A movie about Barney and Betty"   "RENO","RAINES","The Renegade"				
The following program will add this data to the database:
   *MYMEMO.PRG   m.numchars=0   m.end=.F.   m.bytestoend=0   IF USED("mymemo")      SELECT mymemo   ELSE      IF FILE("mymemo.dbf")         USE mymemo IN 0         SELECT mymemo      ELSE         CREATE TABLE mymemo (first C(10), LAST C(15), details m(10))      ENDIF   ENDIF   H=FOPEN("mymemo.txt",10)   IF ! H<0      m.totalchars=FSEEK(H,0,2)  && how many characters in file?      =FSEEK(H,0,0)              && go back to start      DO WHILE (! EOF(H) ) AND (! m.end)         m.first=""         m.last=""         m.details=""         FOR m.numfields = 1 TO 3            DO CASE               CASE m.numfields=1                  m.field="m.first"               CASE m.numfields=2                  m.field="m.last"               CASE m.numfields=3                  m.field="m.details"            ENDCASE            m.numquotes=0            DO WHILE m.numquotes < 2 AND (! m.end)               in_char=FREAD(H,1)               DO CASE                  CASE in_char=["]                     m.numquotes=m.numquotes+1                  CASE m.numquotes=1 AND ;                   (ASC(in_char)=32 OR (ASC(UPPER(in_char))>64 ;                   AND ASC(UPPER(in_char))<91))                     STORE EVALUATE(m.field)+m.in_char TO (m.field)               ENDCASE               m.numchars=m.numchars+1               IF m.numchars = m.totalchars   && are we at the end?                  m.end=.T.                   && set our own EOF marker               ENDIF            ENDDO         ENDFOR         APPEND BLANK         GATHER MEMVAR MEMO      ENDDO      =FCLOSE(H)   ENDIF				
For information about using low-level file commands to export data to adelimited ASCII file, please see the following article in the MicrosoftKnowledge Base:
95722 How to Export Memo Fields to an ASCII File
VFoxWin FoxMac FoxDos FoxWin import

Article ID: 115418 - Last Review: 02/28/2014 07:55:05 - Revision: 2.2

Microsoft Visual FoxPro 3.0 Standard Edition, Microsoft Visual FoxPro 5.0 Standard Edition, Microsoft Visual FoxPro 6.0 Professional Edition, Microsoft FoxPro 2.5b for Macintosh, Microsoft Visual FoxPro 2.5c for Macintosh, Microsoft FoxPro 2.5b for MS-DOS, Microsoft FoxPro 2.5a, Microsoft FoxPro 2.5b for MS-DOS, Microsoft FoxPro 2.6 for MS-DOS, Microsoft FoxPro 2.5b, Microsoft FoxPro 2.5a, Microsoft FoxPro 2.5b, Microsoft FoxPro 2.6 Standard Edition

  • kbnosurvey kbarchive kbcode kbinfo KB115418