1

アクセスできるページから情報を抽出する必要があります。

このモジュールだけでは、エクスポートする手段はありませんが、情報をコピーして貼り付けるだけです

同じlでこのように見えます

1. MANUF MODEL YEAR MFG SERIAL REG OS DATE DESC LISTED
1.年DLV                    
2. モンスター 4r25 1988 23547248 Waka001 2012/7/23 販売 2009/7/22
2. 1989年                 
3. FORD 12SE 1994 6262552 DBZRLZ0 2012 年 7 月 26 日 2009 年 7 月 9 日販売
3. 1994年                  

データを行で取得していますが、年製造元と年 dlv は 1 行内に 2 行 (または同じフィールドに 2 行) あります。Excelに貼り付けると、最初に2行が作成され、年mngを含む行のすべてのデータと、年dlvだけの2行目(同じ列)が作成されます。

余分な列を追加し、その余分なフィールドに対処し、空白を削除するなどして、この情報をExcelで解析できます。しかし、Excel の部分を省略して、これを TXT ファイルからインポートしたいと考えています。このファイルを貼り付けると、1 行あたり 2 行が作成され、区切り文字としてタブが使用されます (txt テキストのタブ区切りのように)。

一括挿入でインポートすると、2 倍の行がインポートされますが、この 2 行目を新しい列に解析する方法が想像できません。

誰かがこれを手伝ってくれますか?t-sql (すべての行には 1 行の情報しかありませんが、列 year mfg /year dlv には 2 つの行があります)。または、何を読むべきか、どちらがより良いアプローチになるか教えてください。一度に2行をインポートするかもしれません。

4

3 に答える 3

2

空白行を含む一時テーブルに、テキスト ファイルからデータ セットをインポートできます。これにより、2 種類のレコードを持つ SQL のデータ セットが得られます。1. 納期以外のデータがすべてあるレコード。2. 配達日のみがあり、他のフィールドがないレコード。(独自のオートインクリメントキーを追加)

関連レコードは 1 レコード離れているため、レコード N とレコード 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の使い方を知っていますか?このコード (FixData()) は、TSQL で使用する前に Excel で実行できるため、余分な行の問題が修正されます。お役に立てれば

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 に答える