Unlock the Power of MEDITECH with MEDITECH KE

1

I was wondering if anyone had an example of reading a txt file into a slash array and displaying it on a report in C/S 5.57. I have tried John Sharpe's method from Tricks of the Trade but it only seems to get the first letter of each line for me.

flag

2 Answers

1

Hi Shane,

Since posting, my method for reading and writing to a file has changed for the better. You might find this code a bit more robust.

Let me know.

John

[detail]
--------------------------------------------------------------------------
@ACCOUNT.SENT.LIST.UPDATE,

ACCOUNT.SENT.LIST.UPDATE
IF{/ACCOUNT.WRITTEN.TO.FILE[@account.number];
@QUOTE_(@account.number)@QUOTE@COMMA_@QUOTE_(@.today)@QUOTE@NEW.LINE.DELIM^/FILE.WRITE,
/FILE.WRITE@File.write,
1^/ACCOUNT.WRITTEN.TO.FILE[@account.number]}

QUOTE
D(34)

NEW.LINE.DELIM
D(13)

COMMA
D(44)

[start]
--------------------------------------------------------------------------
@INITIALIZE.ACCOUNTS.FROM.FILE;

STRING.FIND.REPLACE
; Input(s): /PARAMS
; Output(s): /STRING
; Usage: {@QUOTE,"",/TXT}^@STRING.FIND.REPLACE^/TXT
; Author: John Sharpe
/PARAMS,/PARAMS|0^FIND,/PARAMS|1^REPLACE,/PARAMS|2^STRING,
DO{STRING#(L(STRING,FIND)^P) (STRING$P)REPLACE(STRING%P)^STRING},
STRING^/STRING

INITIALIZE.ACCOUNTS.FROM.FILE
; John Sharpe - 11/15/2009
; Only get new file once per day by file date.
@FILE.BACKUP,
@FILE.NAME.PATH@File.open,
@FILE.READ,
@File.close,
@FILE.DELETE,
@FILE.CREATE,
; Open permanent copy of file and write back accounts from memory.
@FILE.NAME.PATH@File.open,
@GET.ACCOUNTS.FROM.LINES,
1

FILE.PATH.PRODUCTION
@FILE.DIRECTORY_"Archive\Accounts-Sent-"(@.today)(@.now)".txt"^/FILE.PATH.PRODUCTION

FILE.DIRECTORY
"C:\ACCOUNTS\"

FILE.NAME.PATH
@FILE.DIRECTORY
"Accounts-Sent.txt"

FILE.BACKUP
; Returns production file path.
@FILE.NAME.PATH^/PATH.SOURCE,
@FILE.PATH.PRODUCTION^/PATH.TARGET,
{/PATH.SOURCE,/PATH.TARGET}@File.copy,
/PATH.TARGET

FILE.TRUNCATE
@FILE.NAME.PATH@File.truncate

FILE.DELETE
@FILE.NAME.PATH@File.delete

FILE.CREATE
@FILE.NAME.PATH@File.create

FILE.OPEN
@FILE.PATH.PRODUCTION@File.open

FILE.READ
1^Q,D(13)^DELIM,
; Read the file 1 characters at a time into an array /FILE.DATA.
DO{1@File.read^/CHR IF{(/CHR=@QUOTE);
/CHR=@LINEFEED;
(/CHR=@NEWLINE) @FILE.LINE.CTR.INC;
/FILE.DATA[Q]_/CHR^/FILE.DATA[Q]}},
1

FILE.LINE.CTR.INC
IF{(/CHR=DELIM)!(L(/FILE.DATA[Q])>254) Q+1^Q}

GET.ACCOUNTS.FROM.LINES
; Input(s): /FILE.DATA
; Output(s): /ACCOUNTS
""^Q,0^/CTR,
DO{+(/FILE.DATA[Q],/TXT)^Q /TXT^@ACCOUNTS}

ACCOUNTS
/ACCOUNT,1^/ACCOUNTS[/ACCOUNT]

QUOTE
D(34)

NEWLINE
D(13)

LINEFEED
D(10)

PRINTER
!

link|flag
Thanks John! Worked perfectly. – Shane T Mar 2 at 15:38
I'm glad to hear & thank you for mentioning it & joining in on the MEDITECH KE! – John Sharpe Mar 2 at 15:49
1

It's been a while, but try something like this:

"C:\whatever\file\path.txt"^FILE, @Memory.allocate("")^MEM, @Memory.load.file(MEM,FILE),
@Memory.beginning(MEM), DO{@Memory.read.text(MEM)^LINE 1^/VAR[LINE]}, @Memory.free(MEM)

link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.