如何在同一循环中“从 .csv 读取并写入 excel”

Posted

技术标签:

【中文标题】如何在同一循环中“从 .csv 读取并写入 excel”【英文标题】:How To 'Read From .csv and Write To excel' In The Same Loop 【发布时间】:2019-05-28 21:40:56 【问题描述】:

我正在尝试从 .csv 文件中读取数据并将该数据粘贴到 3270 终端屏幕上,同时将这些尝试的结果写入与 .csv 完全镜像的相应 excel 文件中

我创建了从 .csv 文件读取并将值粘贴到 3270 屏幕上的代码。但是很难在 excel 中引用确切的行/行来编写结果

这是我的循环:

  strLine = objFile.ReadLine
  Do Until objFile.AtEndOfStream                
     arrFields = Split(strLine,",") 
     subDoWork (strLine)
  strLine = strLine + 1
  Loop

subDoWork 然后读取 .csv 文件并粘贴数据:

Sub subDoWork(strLine)

    ColumnA = arrFields(0)
    ColumnB = arrFields(1)

     subMoveCursor 1, 10                                                                                             
     subEnterData ColumnA

    If (funcReadScreen(12,27,1) <> "0") Then

      oExcelObject.Cells(3).Value = "Skipped SAF1"
      oExcelObject.DisplayAlerts = False
      ExcelWorkbook.Save
    End If
End Sub

我在这里创建对象并在获取外部文件时设置变量:

Set oExcelObject = CreateObject("Excel.Application")
Set oFileObject  = CreateObject("Scripting.FileSystemObject")

 Sub subExternalFile
   rw = 2
   strFilter = ""
   strExternalFilePath = funcSolicitFile(strFilter)
   strExternalFilePath1 = 
     "\\DAYFS02\mortvc$\_Scripts_Custom\DisasterScript_OutPut.xlsx"
       Set objFile  = oFileObject.OpenTextFile(strExternalFilePath)
       Set oExcelFile   = oFileObject.GetFile(strExternalFilePath1)
       strExcelFileName = oExcelFile.Name
       Set oExcelObject = GetObject("","Excel.Application")
       Set ExcelWorkbook = 
       oExcelObject.Workbooks.Open(strExternalFilePath1)
       Set oExcelSheet   = ExcelWorkbook.Sheets(1)
   oExcelObject.Application.Visible = False
 End Sub

我希望从文本文件的第 1 行读取。要读取 arrfields(0) 和 arrfields(1),只需两列,然后将该数据粘贴到 3270 屏幕上。如果屏幕特别读取某些内容,则写入列 C (3) 中的 excel 文件的第 1 行。然后移动到第 2 行并执行相同操作,读取 .csv 文件,然后写入 excel 文件中相应行号的第 (3) 列。

当它尝试写入 excel 文件时,我收到找不到对象的错误。虽然我正在创建对象。我在尝试计算 strLine 时也会收到“类型不匹配”错误,以便我可以移动到下一行/行。

--------编辑 05/29/2019---------- 我得到了那个工作。我可以在 .csv 文件中逐行移动并粘贴到屏幕上。但是,在写入 excel 时,它每次都会覆盖 C 列(第 2 行,第一行是标题)。根据 .csv 第 3 行的结果,我无法将其写入 excel 的第 3 行 C 列。我也没有将 .csv 的第一行标识为标题,实际上我从 .csv 中删除了标题,但在 excel 文件中仍然有标题(第 1 行)。所以从技术上讲,.csv 中的第 1 行是 excel 中的第 2 行。我不确定是否需要在我的第一个循环中放置一个循环,以便计算 excel 中的行数,并确保我根据 .csv 中的行在 excel 中写入正确的行。感谢您的帮助。

【问题讨论】:

事实证明,我可以使用上述代码写入 excel 文件。但我无法进入文本文件 (.csv) 的下一行,然后进入 excel 文件中的相应行。我无法计算文本文件中的行数,例如 excel strLine 中的行实际上给了我行中的文本而不是整数来计数,这样我就可以将其移至 .csv 中的下一行和中的相应行excel输出文件 所以我需要帮助从文本文件中的第 1 行移动到第 2 行,依此类推。以及写入第 1 行和第 2 行的 excel 文件中的 C 列等等。 请不要在 cmets 中添加额外的信息。只需编辑问题。 【参考方案1】:

你得到一个类型不匹配,因为你试图在这一行的字符串中添加一个整数 (1)。

strLine = strLine + 1

如果您想跟踪正在处理的行,则需要调暗一个新的行计数器变量。 您还需要阅读循环内的行,否则您将陷入无限循环。

类似这样的:

dim i
i = 0
Do Until objFile.AtEndOfStream   
   strLine = objFile.ReadLine             
   arrFields = Split(strLine,",") 
   subDoWork  strLine
   i = i + 1
Loop

【讨论】:

以上是关于如何在同一循环中“从 .csv 读取并写入 excel”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 if else 循环中对同一数据使用多个条件? - java/安卓

如何在 python 循环中更新 matpplotlib 库图,该图位于 Jupyter 笔记本中的同一位置?

如何排除在同一 start_dt 上的数据中创建循环的记录?

所以我刚刚创建了一个文本文件并使用 with 循环从现有文件中复制了文本。如何在同一个 prog 中打开新创建的文件?

Qt 如何在同一个 EventLoop 中处理事件和信号

如何在循环symfony2中为同一实体添加重复的表单