【问题标题】:Inserting blank rows between records and outputting to CSV在记录之间插入空白行并输出到 CSV
【发布时间】:2011-11-03 19:02:08
【问题描述】:

我需要修改两个 CSV 文件中的字符串。我使用的是 Windows XP。

文件名为 pi_jobs.csvpi_offices.csv

我需要在每条记录之间留两个空格,然后在最后一条记录之后留两个空行。

文件由基于 Access 的应用程序生成,我已经能够通过 SQL 语句在输出中创建空白行(基本上,查询中的最后一个字段连接了两组 Chr(10) 和Chr(13) 个字符,给我两个换行符和两个回车符)。

但是,当我将文件输出到 CSV 时,它会将这些回车符和换行符作为单独的字段包含在记录中,因此在字段之前放置一个逗号,并在字段周围加上引号。

我在下面提供了一个示例。注意第一条和第二条记录之间的差距。第一条记录的末尾有逗号和引号,第二条记录的开始之前有一个右引号:

“获得认可的医疗协助计划,有资格获得 AAMA 或 AMT 认证;需要高中文凭或GED;至少三年的医疗或相关业务办公室工作经验;静脉切开术和注射管理的工作知识。期望:副学士学位。","


"
"TBP20113105-82792","chicago-edgewater","9999999","TBP 医疗助理"

我在这里对我的页面格式非常小心 - 这正是行间距的外观。该间距中有三个行间距。然而,它应该是这样的:

“获得认可的医疗协助计划,有资格获得 AAMA 或 AMT 认证;需要高中文凭或GED;至少三年的医疗或相关业务办公室工作经验;静脉切开术和注射管理的工作知识。期望:副学士学位。”


"TBP20113105-82792","chicago-edgewater","9999999","TBP 医疗助理"

【问题讨论】:

    标签: vba csv ms-access replace


    【解决方案1】:

    这是一个纯 Access 解决方案。

    第 1 步:在您的数据库中添加对 Microsoft Scripting Runtime 库的引用

    第 2 步:创建一个函数,该函数将打开表/查询并逐行读取记录并输出到 .csv 文件

    Function OutputToCsv()
    Dim fs As FileSystemObject
    Dim ts As TextStream
    Dim rs As Recordset
    
    On Error GoTo lberr
    
    'use this if you query a single table
    Set rs = CurrentDb.OpenRecordset("Select Column1, Column2, Column3 From NewTable")
    
    'use this if your query DOES NOT have any parameters
    'Set rs = CurrentDb.OpenRecordset("Select Column1, Column2, Column3 From NewQuery")
    
    'use this if you use query WITH parameter(s)
    'Dim qdf As QueryDef
    'Set qdf = CurrentDb.QueryDefs("NewQuery")
    'qdf.Parameters("Parameter1") = "" 'set the value for the parameter(s)
    'Set rs = qdf.OpenRecordset
    
    If (rs.RecordCount = 0) Then Exit Function
    
    Set fs = New FileSystemObject
    Set ts = fs.CreateTextFile("C:\NewFile.csv", True, False) 'this will overwrite the file each time
    
    rs.MoveFirst
    
    Do While Not rs.EOF
        'Chr(34) is a quotation mark "
        ts.WriteLine (Chr(34) & rs("Column1") & Chr(34)) 'format your record output
        'ts.WriteLine (Chr(34) & rs("Column1") & Chr(34) & "," & Chr(34) & rs("Column2") & Chr(34)) 'in case you need to output more than one column
        ts.WriteBlankLines (2) 'Add as many empty lines as you need
        rs.MoveNext
    Loop
    
    ts.Close
    
    MsgBox "Success!"
    
    Exit Function
    lberr:
        MsgBox Err.Description
    End Function
    

    而且,你的输出文件应该是这样的:

    【讨论】:

    • 谢谢 - 您的语句中有什么方法可以指定要运行的查询吗?在您的示例中,您有以下行: Set rs = CurrentDb.OpenRecordset("Select Column1, Column2, Column3 From NewTable") 但我尝试在该行中包含(并修改)我的查询 SQL,但我正在编译错误。如果它有帮助,查询名称是“aje-job-output-query”。谢谢!
    • 当然,也可以使用查询。我将编辑我的帖子以包含该内容
    • 如何使用文件系统对象作为“纯访问解决方案”,尤其是当 VBA 具有无需任何额外引用即可执行此操作的文件 I/O 函数时?