[AccessD] Exporting comma delimited data

Charlotte Foust cfoust at infostatsystems.com
Tue Apr 11 11:25:29 CDT 2006


 Oops!  I suppose it would have helped if I had remembered to paste the
code in! LOL


Charlotte

'**** Code Begins **********
Public Function CreateTextFileFromRST(ByVal strOutputTblNm As String, _
                              ByVal strLinkSpec As String, _
                              ByRef rst As ADODB.Recordset, _
                              Optional blnOverwrite As Boolean = True, _
                              Optional blnFieldNames As Boolean = True)
As Boolean
  'Author:  Charlotte Foust
  'Created: 7/3/2001
  'modified 7/5/2001 - added code to write fieldnames to file
  'Based on CreateTextFile by Charlotte Foust

  'requires reference to Microsoft Scripting Library
  'SCRRUN.DLL for early binding of FileSystemObject
  'A reference to Microsoft Office 9.0 object library
  'will work with late binding

 'Creates tab delimited text file from table or query then links file.
 'Used to replace temporary tables and reduce bloat.

  On Error GoTo Proc_err
  Dim varItem As Variant
  Dim strOutputFile As String
  Dim strTempTblNm As String
  Dim intPosition As Integer        'holds result of instr() function
  Dim varFields As Variant
  Dim varLines As Variant
  Dim intFldCount As Integer
  Dim lngRecords As Long
  Dim intLoop As Integer
  Dim intIndex As Integer
  Dim blnContinue As Boolean
  Dim intCmdType As Integer         'holds commandtype constant
  Dim fld As ADODB.Field              'holds each ADO field object
  Dim cnn As ADODB.Connection   'holds ADO connection object
  Dim errsCnn As ADODB.Errors     'holds ADO Errors collection
  Dim errCurr As ADODB.Error        'holds each ADO error
  Dim objFS As FileSystemObject   'holds FileSystemObject
  Dim objTxtStream As TextStream  'holds TextStream object
  
  'instantiate the objects
  Set cnn = CurrentProject.Connection
  Set errsCnn = cnn.Errors
  
  'make sure the output file name has a txt extension
  intPosition = InStr(strOutputTblNm, ".")
  If intPosition = 0 Then
  
    strTempTblNm = strOutputTblNm
    strOutputTblNm = strOutputTblNm & ".txt"
  Else 'intPosition = 0
  
    strTempTblNm = Left(strOutputTblNm, intPosition - 1)
    strOutputTblNm = Left(strOutputTblNm, intPosition) & "txt"
  End If 'intPosition = 0
  
  'create the full path and temp file name
  'if only a filename was passed
  If InStr(strOutputTblNm, "\") = 0 Then
    strOutputFile = CurrentProject.path & "\" & strOutputTblNm
  Else
    strOutputFile = strOutputTblNm
  End If 'InStr(strOutputTblNm, "\") = 0
  
  'delete the old temp file
  On Error Resume Next
  Kill strOutputFile
  
  On Error GoTo Proc_err
  
  With rst
    If .EOF Then
      'there are no records to process
      'so the routine will exit
      lngRecords = 0
    Else '.EOF
      blnContinue = True
      'get the recordcount
      .MoveLast
      lngRecords = .RecordCount
      .MoveFirst
      'set up the array to hold the
      'field values
      intFldCount = .Fields.Count
      
      intLoop = 0
      'dim the array depending on whether
      'fieldnames are being included
      If Not blnFieldNames Then
        ReDim varLines(lngRecords - 1)
      Else 'If Not blnFieldNames
        ReDim varLines(lngRecords)
        
        'create a "field names" record for the file
        'put each field name into a string array
         varFields = Null
        Set fld = Nothing
        
        For Each fld In .Fields
          'add the field value to a semicolon
          'delimited string of values
          varFields = varFields & fld.name & ";"
        Next fld
        
        'strip off the last semicolon
        varFields = Left(varFields, Len(varFields) - 1)
        
        'convert the string to an array based
        'on the semicolon delimiter.
        varFields = Split(varFields, ";")
        'turn the array into a tab delimited string
        'and assign it to a single element of the line array
        varLines(intLoop) = Join(varFields, Chr(9))
        intLoop = intLoop + 1
      End If 'Not blnFieldNames
      
      'add the records to the array
      Do
        'put the data from each field into
        'a string then put the string
        'into an array
        varFields = Null
        Set fld = Nothing
        
        For Each fld In .Fields
          varItem = fld.Value
          If Not IsNull(varItem) Then
            'strip out any non-printing characters
            
            'remove the vbNewLine/vbCr character chr(13)
            If InStr(CStr(varItem), vbCr) > 0 Then
              varItem = Replace(CStr(varItem), vbCr, ", ")
            End If 'InStr(CStr(varItem), vbCr) > 0
            
            'remove the vbLf character chr(10)
            If InStr(CStr(varItem), vbLf) > 0 Then
              varItem = Replace(CStr(varItem), vbLf, ", ")
            End If 'InStr(CStr(varItem), vbLf) > 0
          End If 'Not IsNull(varItem)
            
         'add the field value to a semicolon
         'delimited string of values
          varFields = varFields & varItem & ";"
        Next fld
        'strip off the last semicolon
        varFields = Left(varFields, Len(varFields) - 1)
        'convert the string to an array based
        'on the semicolon delimiter.  This gets
        'around fields than contain commas
        varFields = Split(varFields, ";")
        'turn the array into a tab delimited string
        'and assign it to a single element of the line array
        varLines(intLoop) = Join(varFields, Chr(9))
        'go to the next record
        intLoop = intLoop + 1
        .MoveNext
      Loop Until .EOF
    End If '.EOF
  End With 'rst
    
  'clean up object variables
  Set fld = Nothing
  rst.Close
  Set rst = Nothing
  
  If blnContinue Then
  
    'create a FileSystemObject
    Set objFS = CreateObject("scripting.filesystemobject")
    
    'create a TextStream Object to handle output
    Set objTxtStream = objFS.CreateTextFile(strOutputFile, blnOverwrite)
    
    'loop through the Lines array and
    'write each line to the TextStream object
    For intLoop = 0 To UBound(varLines)
      objTxtStream.WriteLine varLines(intLoop)
    Next intLoop
    objTxtStream.Close
  End If 'blnContinue
  
  If lngRecords = 0 Then
    MsgBox "There were no records to write to the specified file."
  End If 'lngRecords = 0
  
Proc_exit:
  On Error Resume Next
  'clean up object variables
  Set objTxtStream = Nothing
  Set objFS = Nothing
  Set fld = Nothing
  rst.Close
  Set rst = Nothing
  Set errsCnn = Nothing
  Set errCurr = Nothing
  Set cnn = Nothing
  CreateTextFileFromRST = blnContinue
  Exit Function
Proc_err:
  If errsCnn.Count > 0 Then
    For Each errCurr In errsCnn
      MsgBox errCurr.Number & "--" & errCurr.Description & vbCrLf _
              & CurrentProject.name & ".CreateTextFile"
    Next errCurr
    errsCnn.Clear
  End If
  If Err <> 0 Then
    MsgBox Err.Number & "--" & Err.Description
  End If
  blnContinue = False
  Resume Proc_exit
End Function 'CreateTextFileFromRST(ByVal strOutputTblNm As String, _
                              ByVal strLinkSpec As String, _
                              ByRef rst As ADODB.Recordset, _
                              Optional blnOverwrite As Boolean = True)
As Boolean
'**** Code Ends **********

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Charlotte
Foust
Sent: Tuesday, April 11, 2006 9:03 AM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] Exporting comma delimited data

John,

Here's an ancient bit from my early ADO days for creating a tab
delimited file with optional fieldnames.  You can probably adapt it, but
don't expect it to be terribly elegant because it was written based on
ADO 2.1 and I was fumbling my way through it. 


Charlotte Foust

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of John Colby
Sent: Tuesday, April 11, 2006 8:22 AM
To: 'Access Developers discussion and problem solving'
Subject: [AccessD] Exporting comma delimited data

Does anyone have code for exporting an ADO recordset to comma delimited,
complete with header (if desired), quoting of data if the data contains
commas etc?

John W. Colby
www.ColbyConsulting.com 





More information about the AccessD mailing list