1

我需要从我可以访问的页面中提取信息。

就在这个模块中,我没有办法导出,只能复制粘贴信息

在同一个 l 中看起来像这样

1. MANUF MODEL YEAR MFG SERIAL REG OS DATE DESC LISTED
1. 年 DLV                    
2. 怪物 4r25 1988 23547248 Waka001 7/23/2012 出售 7/22/2009
2. 1989                 
3. 福特 12SE 1994 6262552 DBZRLZ0 7/26/2012 出售 7/9/2009
3. 1994                  

我正在逐行获取数据,但年份 mfg 和年份 dlv 在一行中的两行(或同一字段中的两行)。当粘贴在 excel 上时,它首先制作 2 行,其中包含行中的所有数据,包括年份 mng 和仅用于年份 dlv 的第二行(在同一列中)。

我可以通过添加额外的列并处理该额外的字段并删除空白等来在 excel 中解析这些信息。但是我想省略 excel 部分并从 TXT 文件中导入它,该文件在粘贴时也会每行创建 2 行,并使用制表符作为分隔符(如 txt 文本制表符分隔)。

当我使用批量插入导入时,它会导入两倍的行,但我无法想象将第二行解析为新列的方法。

有人可以帮忙吗?在 t-sql 中(每一行只有一行信息,但在 year mfg /year dlv 列中,有两行)。或者指出我要阅读什么或哪种方法更好?也许一次导入 2 行 ETC。

4

3 回答 3

2

您可以将文本文件中的数据集导入到包含空白行的临时表中。这将为您提供具有 2 种记录类型的 SQL 数据集。1. 包含交货日期以外的所有数据的记录。2. 只有交货日期而没有其他字段的记录。(添加唯一的自动增量键)

因为相关的记录会分开一条记录,所以Record N和Records N+1实际上是同一条记录。

然后一个选择查询通过 RecID = RecId+1 将临时表连接到其自身将给出包含所有字段的完整记录

SELECT * FROM tmpTable AS MainRecord
INNER JOIN tmpTable AS MissingField
ON MainRecord.RecId = MissingField.RecId +1

从这个数据集中,您可以插入到您的主要数据中。

于 2012-08-25T09:12:55.013 回答
1

你知道如何使用VBA吗?在 TSQL 中使用此代码之前,您可以在 Excel 中运行此代码 (FixData()),从而修复额外的行问题。希望这可以帮助

Option Explicit

Public Sub FixData()
    Dim ws As Excel.Worksheet
    Dim iCurRow As Long
    Dim iLastRow As Long

    Set ws = ActiveSheet
    iLastRow = ws.Cells.SpecialCells(xlCellTypeLastCell).Row

    ' move through the spreadsheet from bottom to top
    For iCurRow = iLastRow To 1 Step -1
        If (isCurrentRowMessedUp(ws, iCurRow) = True) Then
            Call AppendDataToPreviousRow(ws, iCurRow)

            ' delete the row since we moved the data out of there
            ws.Rows(iCurRow).EntireRow.Delete
        End If
    Next
End Sub

Private Sub AppendDataToPreviousRow(ByRef ws As Excel.Worksheet, ByVal currentRow As Long)
    Dim firstCellInRow As Excel.Range
    Dim lastCellInRow As Excel.Range
    Dim previousRowRangeToPaste As Excel.Range

    ' check if first column has data in it, otherwise find the first column that has data
    If (ws.Cells(currentRow, 1).Value = vbNullString) Then
        Set firstCellInRow = ws.Cells(currentRow, 1).End(xlToRight)
    Else
        Set firstCellInRow = ws.Cells(currentRow, 1)
    End If

    Set lastCellInRow = ws.Cells(currentRow, ws.Columns.Count).End(xlToLeft)
    Set previousRowRangeToPaste = ws.Cells(currentRow - 1, getNextColumnAvailableInPreviousRow(ws, currentRow))

    ws.Range(firstCellInRow, lastCellInRow).Cut previousRowRangeToPaste
End Sub

Private Function isCurrentRowMessedUp(ByRef ws As Excel.Worksheet, ByVal currentRow As Long) As Boolean
    Dim cellCountInRow As Long
    Dim firstCellInRow As Excel.Range
    Dim lastCellInRow As Excel.Range

    Set firstCellInRow = ws.Cells(currentRow, 1)
    Set lastCellInRow = ws.Cells(currentRow, ws.Columns.Count).End(xlToLeft)

    cellCountInRow = Application.WorksheetFunction.CountA(ws.Range(firstCellInRow, lastCellInRow))

    If (cellCountInRow <= 1) Then
        isCurrentRowMessedUp = True
    Else
        isCurrentRowMessedUp = False
    End If
End Function

Private Function getLastColumnInPreviousRow(ByRef ws As Excel.Worksheet, ByVal currentRow As Long) As Long
    Dim rng As Excel.Range
    Set rng = ws.Cells(currentRow - 1, 1).End(xlToRight)

    getLastColumnInPreviousRow = rng.Column
End Function

Private Function getNextColumnAvailableInPreviousRow(ByRef ws As Excel.Worksheet, ByVal currentRow As Long) As Long
    getNextColumnAvailableInPreviousRow = getLastColumnInPreviousRow(ws, currentRow) + 1
End Function
于 2012-08-25T02:05:32.713 回答
-1

您可以使用SQL Server Integration Service (SSIS)将数据从任何源数据(如 excel)转换为任何目标数据(如 SQL Server)

在此处输入图像描述

于 2012-08-25T04:32:19.200 回答