2014-02-27 59 views
0

我有一个Excel工作表和它的humongous ..大约像200000行需要处理。 我所要做的就是读取它并使用DB2表上的查询处理它们。我已经编写了超过8小时处理5000行的程序。读取excel行并同时处理它

有没有一种方法可以让我同时读取excel并执行查询。我希望他们独立于这个过程。我不能使用Parallel.for作为阅读并创建这么多的线程实例没有好处。任何管道和队列都没用。这是一种使用dom方法,它不读取一行,它读取一个字符串。如果行上有一个空值,它将执行该行并引发一个空异常。我和后台工作人员以及TPL很好。任何想法或代码将不胜感激。无DLL可以使用除了从OPENXML

理想的情况下,我不希望添加到阵列,,我想在2个差异变量,读取时对其进行处理..

  1. 读取一行(只有2列,忽略其他的cols
  2. 创建一个线程来执行行和并行,执行读取行。
  3. 合并成一个单一的表。
  4. 显示效果..听起来简单,但也有挑战。

Try 
    Using spreadsheetDocument As SpreadsheetDocument =  spreadsheetDocument.Open(fileName, False) 

     Dim workbookPart As WorkbookPart = spreadsheetDocument.WorkbookPart 
     Dim worksheetPart As WorksheetPart = workbookPart.WorksheetParts.First() 
     Dim sheetData As SheetData = worksheetPart.Worksheet.Elements(Of SheetData)().First() 
     For Each r As Row In sheetData.Elements(Of Row)() 
      For Each c As Cell In r.Elements(Of Cell)() 
       Dim text As String 
       Try 
        text = c.CellValue.Text.ToString 
        Debug.Print(text.ToString) 
        If text IsNot Nothing AndAlso Trim(text).Length > 0 Then 
         Arr.Add(text.ToString) 
        End If 
        text = Nothing 
        j += 1 
       Catch 
       End Try 
      Next 
      text = Nothing 
     Next 
    End Using 
Catch ex As Exception 
    MsgBox("Exception caught: " + ex.Message) 
    Debug.Print(ex.Message.ToString) 
    End 
End Try 
myArr = CType(Arr.ToArray(GetType(String)), String()) 

这是其将数据分成2个参数

For i As Integer = 2 To myArr.Count - 1 Step 2 
    If i And 1 Then 
     i = i - 1 
    Else 
     dstr = DateTime.FromOADate(Double.Parse(myArr(i).ToString())).ToShortDateString() 
     'Debug.Print(dstr.ToString & "----->" & i.ToString & "TCID--->" & myArr(i + 1).ToString) 
     DQueue.Enqueue(DateTime.FromOADate(Double.Parse(myArr(i).ToString())).ToShortDateString()) 
     Tqueue.Enqueue((myArr(i + 1).ToString())) 
     TCArr.Add((myArr(i + 1).ToString())) 
     dc.Merge(ProcessQueryODBC(dstr, myArr(i + 1).ToString)) 

     If dc.Rows.Count > 0 Then 
      dt.Merge(dc) 
     Else 
      nFound.Merge(CreateDT(dstr, myArr(i + 1).ToString())) 
     End If 
    End If 
Next 

回答

0

代替打开通过ODBC一个DB连接的过程。您可以将数据导出为CSV文件,然后让DB2执行import

somestring = "import from "myfile.csv" of DEL ...." 
DoCmd.RunSQL somestring 
相关问题