0

csvファイルを処理してリモートサーバーにアップロードするアプリケーションを作成しています。アプリケーションは、列のカスタム マッピングを可能にするために、かなり柔軟である必要があります。

私が直面した最初の大きなハードルは、ファイルを読み取ることです。多くのファイルには、行 5+ から始まるデータがあり、上部にいくつかのジャンク データがあります。以下の例を参照してください。

Account: 123
----------
Date: 15/12/2011
----------
Type: Full
----------
Column1,Column2,Column3,Column4
Data1,Data2,Data3,Data4
Data1,Data2,Data3,Data4

理想的には、データの最初の行を取得する方法が必要ですが、これは難しいかもしれません。

接続文字列で Jet を使用してファイルに接続しています。

If (_extension = ".csv") Then

                _excelconn.ConnectionString = String.Format( _
                    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" & _
                    "; Extended Properties=""text;HDR=No;FMT=Delimited""", _directory)

End If

次に、コードを介してデータを取得します。

If ValidateAll() Then
            Try

                ConnectExcel() ' Opens connection to csv/excel file

                _excelcommand.CommandText = "SELECT * FROM [" & _excelsheets(_selsheet) & "]" ' Currently selected sheet, returns SELECT * FROM [1234#csv]
                _excelcommand.Connection = _excelconn

                _reader = _excelcommand.ExecuteReader()

                While _reader.Read()

                    'MsgBox(_reader(0).ToString)
                    'Dostuff

                End While

            Catch ex As Exception
                _errors.Add(ex.ToString)
                retval = -1
            End Try


        End If

reader(2)最初の行にアクセスできないため、これは例外で失敗しています。

SELECTシートの最初の X 行をスキップするように Jet に指示する接続文字列またはステートメントに方法はありますか? reader.Read()そうでない場合、行番号が X より大きい場合にのみ処理する方法はありますか?

ファイル全体を配列に読み取ってそこから解析するか、ファイルの内容を新しいcsvファイルにコピーすることでおそらく可能であることはわかっていますが、それを回避してjet/adoを介して行う方法がある場合は、はるかに好むでしょうそれ!

(adoクエリに解決策sqlがあるかもしれないとタグ付けされています)sql

4

1 に答える 1

0

多くの実験と検索の後に答えを見つけ、テーブルアダプターに移動しました。コードは次のとおりです。

Private _filepath As String
Private _directory As String
Private _filename As String
Private _extension As String
Private _selsheet As Integer
Private _skiprows As Integer
Private _data As New DataTable

Private _excelconn As New OleDbConnection
//Private _reader As OleDbDataReader
Private _excelcommand As New OleDbCommand
Private _excelta As New OleDbDataAdapter

_excelcommand.CommandText = "SELECT * FROM [" & _excelsheets(_selsheet) & "]"
_excelcommand.Connection = _excelconn

_excelta.SelectCommand = _excelcommand
_data = New DataTable
_excelta.Fill(_skiprows, Int32.MaxValue, _data)


For i = 0 To _data.Columns.Count - 1
    If _data.Rows(0).Item(i).ToString <> "" And IsNothing(_data.Columns(_data.Rows(0).Item(i).ToString)) Then
          _data.Columns.Item(i).ColumnName = _data.Rows(0).Item(i).ToString
    End If
Next

_data.Rows.RemoveAt(0) //removes first data row containing labels
于 2012-09-03T16:03:42.383 に答える