Solved

coldfusion read plain text file

Posted on 2013-05-28
9
543 Views
Last Modified: 2013-05-28
Here is my situation. Windows 2008, Coldfusion 10. Trying to create some type of basic document management system.

My Xerox 7500 series multi-function machine can scan docs to a network share. The scanned pdf as well as a .XST job log file is saved. The XST file is plain text and contains some info about the job I would like to read. Can coldfusion read this text file??

There is a line MetaDataValue = "123456"

Any ideas? I've read about cffile and maybe using cfloop, just not sure if these are good to use, or what is easiest or best. Thanks for nay help!
0
Comment
Question by:cb_it
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
9 Comments
 
LVL 52

Expert Comment

by:_agx_
ID: 39202415
Sure you can read it if it's a text file.  What's the typical file size? As long as it's not a huge file, looping through it is fine. You just need the right delimiter and pattern.

    > There is a line MetaDataValue = "123456"

Is it always in that format ie MetaDataValue = "(something different here)"  ?  Do any other lines start with "MetaDataValue  = "? If it's just the one, you could do:


<cfset fileContent = FileRead("c:\path\to\yourFile.xst")>

<cfset lineToFind = "">
<cfloop list="#fileContent#" index="line" delimiters="#chr(10)##chr(13)#">
      <cfset firstCol = getToken(trim(line), 1, "=")>
      <cfif trim(firstCol) eq "MetaDataValue">
            <cfset lineToFind = line>
      </cfif>
</cfloop>

<cfoutput>
lineToFind = #lineToFind#
</cfoutput>
0
 

Author Comment

by:cb_it
ID: 39202439
Just that 1 line is called MetaDataValue. The number it contains is a number the user is forced to type in before they can scan. For example they would have to input 987654 into the machine for the loan number they are about to scan. Hope that makes sense.

The xst file is small maybe 3-4KB. Here is part of it. There will be many xst files, can CF loop through ALL of these files, and then read the MetaDataValue??

[description xrx_dscrpt_metadata]
1{
* string MetaDataPrompt = "LOAN_NUMBER";
* string MetaDataFieldName = "LOAN_NUMBER";
* boolean MetaDataRequiredEntry = TRUE;
* string MetaDataType = "string";
string MetaDataValue = "123456";
boolean MetaDataValidationRequired = FALSE;
enum_metadatamaskingrequired MetaDataMaskingRequired = NONE;
}
end


I will try your code and report back. Thanks.
0
 

Author Comment

by:cb_it
ID: 39202462
The file is NOT a csv file, I think, so not sure if you are trying to break apart or trim some columns with your code??

I ran your code and just got lineToFind =

Nothing else.
0
Quiz: What Do These Organizations Have In Common?

Hint: Their teams ended up taking quizzes, too.

 
LVL 52

Expert Comment

by:_agx_
ID: 39202557
It doesn't have to be CSV. You can use cfloop with any delimiter, like a new line in my example. But it won't work anyway, because the line doesn't start with "MetaDataValue" it starts with "string MetaDataValue".

If all the files are that small, I'd recommend a regex instead.  I'm not very good at those. This works with the example above, but I'd suggest getting an opinion from a real regex guru instead :)

<cfset theValue  = "">
<cfset match = reMatchNoCase('MetaDataValue\s+=\s+"([^"]+)"', fileContent)>
<cfif arrayLen(match)>
	<cfset theValue = getToken(match[1], 2, '"')>
</cfif>
<cfoutput>#theValue#</cfoutput>

Open in new window

0
 
LVL 52

Expert Comment

by:_agx_
ID: 39202585
> can CF loop through ALL of these files, and then read the MetaDataValue??


You'd need something like DirectoryList to get the files you want to process. Then loop through the query and run the code above for each file.

       <cfset fileArray = DirectoryList("c:\yourDirectory", false, "path", "*.xst ")>
        <cfloop array="#fileArray#" index="filePath">
              <cfset fileContent = FileRead(filePath)>
              ... code to parse content ....
       </cfloop>

If possible this should be done each time you scan, rather than after the fact ie processing a whole directory of files. If that is not possible, try and do it in small batches, because anything that iterates thousands of times takes a while.
0
 

Author Comment

by:cb_it
ID: 39202607
That works! Incredible, just a fe wlines of code. Here is my test code so far. I'm pulling 2 pieces of info out of the XST file and it's working. This is just reading the 1 xst file called cffile1.xst. How can this read all of the xst files in that one directory??

<cfset fileContent = FileRead("F:\SCANS\cffile1.xst")>

<cfset theValue1  = "">
<cfset match = reMatchNoCase('MetaDataValue\s+=\s+"([^"]+)"', fileContent)>
<cfif arrayLen(match)>
      <cfset theValue1 = getToken(match[1], 2, '"')>
</cfif>

<cfset theValue2  = "">
<cfset match = reMatchNoCase('DocumentObjectName\s+=\s+"([^"]+)"', fileContent)>
<cfif arrayLen(match)>
      <cfset theValue2 = getToken(match[1], 2, '"')>
</cfif>

<cfoutput>#theValue1# #theValue2#</cfoutput>
0
 
LVL 52

Accepted Solution

by:
_agx_ earned 500 total points
ID: 39202637
Just do a directory listing. It'll return an array of files. Then loop through the array, and put your code inside the loop.  Not sure if you saw this, but see here
 

        <cfset fileArray = DirectoryList("F:\SCANS", false, "path", "*.xst ")>
        <cfloop array="#fileArray#" index="filePath">
              <cfset fileContent = FileRead(filePath)>
               
              <cfset theValue1  = "">
              <cfset match = reMatchNoCase('MetaDataValue\s+=\s+"([^"]+)"', fileContent)>
              .... etc...
 
       </cfloop>

Though I'm pretty sure one of the regex guys could come up with something way cooler than my lame expression ;-)
0
 

Author Comment

by:cb_it
ID: 39202691
Woops, sorry, reading too fast and didnt see all of your post above. That array worked like a champ, thanks. Started using CF back in the 90's and have been out of the web game for quite some time.
0
 
LVL 52

Expert Comment

by:_agx_
ID: 39202785
Welcome back. You'll pick it back up in no time.  It's amazing how much its grown. If you want a laugh, take a look at the function list for CF4.5 vs CF9 some time. Boy what a difference!
0

Featured Post

[Webinar] Learn How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

PROBLEM:  How to open a cfwindow or run a function on double click of a cfgrid row. One of my clients wanted to be able to double click on a row item to get more detailed information about a transaction and to be able to modify the line items i…
Today, I was working on some optimization and spam-stopping techniques when I encountered Ben Nadel's post to reduce spam feature using Math (http://www.bennadel.com/blog/197-How-I-Stop-Spammers-On-My-ColdFusion-Blog.htm). While this method is not o…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
Add bar graphs to Access queries using Unicode block characters. Graphs appear on every record in the color you want. Give life to numbers. Hopes this gives you ideas on visualizing your data in new ways ~ Create a calculated field in a query: …

627 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