3

インポートしようとしているタブ区切りのテキスト ファイルは次のようになります (4 つのフィールド、フィールド 3 は複数行)... および約 100,000 行のデータ:

以下は単なるサンプルです...しかし、複数行のテキストが複数のフィールドにある可能性がある一般的な解決策を教えてください...たとえば、合計10フィールドのfld3、fld6、fld7などです。

Field 1 <tab> Field 2 <tab> Field 3.1
Field 3.2
Field 3.3<tab>Field 4
Field 1 <tab> Field 2 <tab> Field 3.1
Field 3.2
Field 3.3<tab>Field 4
Field 1 <tab> Field 2 <tab> Field 3.1
Field 3.2
Field 3.3<tab>Field 4

しかし、実際にデータベースから上記のテキスト ファイルにエクスポートすると、実際には 3 行ありました... このように見えました... 4 つのフィールド。フィールド 3 は複数行です。

Field 1 <tab> Field 2 <tab> Field 3.1(CR)Field 3.2(CR)Field 3.3<tab>Field 4
Field 1 <tab> Field 2 <tab> Field 3.1(CR)Field 3.2(CR)Field 3.3<tab>Field 4
Field 1 <tab> Field 2 <tab> Field 3.1(CR)Field 3.2(CR)Field 3.3<tab>Field 4

ここで、 はタブ、(CR) はキャリッジ リターンです。タブ区切りのテキスト ファイルを Excel にインポートするとき、フィールド 3 (フィールド 3.1、フィールド 3.2、およびフィールド 3.3) の 3 行すべてを 1 つのセルに入れたいのですが、複数行にします。基本的に、フィールド 3 のキャリッジ リターンを Excel で無視するようにしたいのですが、どうすればいいですか?

参考までに...テキストフィールドは二重引用符で囲まれていません...プレーンテキストのタブ区切りテキストファイルを次のようにExcel 4列に変換する最良の方法を教えてください:

エクセルファイル

誰かが解決策を知っていますか。それは大歓迎です。

追加コメント

私が持っているのは結果のテキスト ファイルだけであることに注意してください...このメッセージの一番上に示されているように.... 行 2 に "Field 3.2"、行 3 に "Field 3.3" および "Field 4" というテキストがあります。それらを分離して。

また...必ずしもフィールド3が常に複数行になるとは限りません...2行、3行、またはそれ以上の行を持つ複数行の場合もあれば、何もないか単一行の場合もあります。フィールド 3 自体に with が含まれることはありません。

テスト用のサンプル ファイルに関する追加コメント - 2013 年 6 月 25 日更新 09:05 UTC

pls はコピー ペーストが機能しないことに注意してください。タブが失われるため、自分で追加する必要があります。

複数行フィールドを引用符で囲んだファイル:

f1hdr   f2hdr   f3hdr
f11 "f12
part of f12"    f13
f21 "f22part of f22
part f22
part f22
part f22"   f23
f31 "f32aaa"    f33
f41 "f42bbb"    f43

複数行フィールドを囲む引用符のないファイル:

f1hdr   f2hdr   f3hdr
f11 f12
part of f12 f13
f21 f22part of f22
part f22
part f22
part f22    f23
f31 f32aaa  f33
f41 f42bbb  f43

Excel で引用符付きのファイルを開きます... ファイル ダイアログを開く... Shift キーを押しながら [開く] をクリックします。複数行でファイルを適切に表示します。

引用符でキャプチャ 2

しかし、引用符なしでファイルを開くと..機能しません..壊れます。

シフトを保持する理由がわかりません。私はここからこれを知っていました: Import multiline csv files into Excel internationally

今..それはまだ答えられていない.

1) Excel にインポートする前に、テキスト ファイルの前後に引用符を簡単に追加する方法... Shift Open が機能するのはなぜですか? テキスト インポート ウィザードを使用して、区切られた各列を制御したい場合はどうすればよいですか?

2) SQL Server 2015 でデフォルトでフィールドを引用符で囲む方法。これは上記の Q1 に追加されます。ファイルを再度エクスポートできない解決策が必要です。しかし、新しいエクスポートについては、誰かが Q2 の回答を使用できます。

3)さらに簡単な他の方法はありますか?

4

3 に答える 3

3

これが私が思いついたものです。最後の列に改行がないことを保証できる場合、これは問題なく機能するはずです。

これにより、VBA でテキスト ファイルが読み取られ、ワークブックに取り込まれます。予想されるフィールドの数を指定する必要があります (テスト シナリオでは 4)。これは、いつ新しい行を開始する準備ができたかを追跡できるようにするためです。

キャリッジ リターンのために少し混乱しますが、コードをステップ実行すると、理解できると思います。ご不明な点がございましたら、お知らせください。

Option Explicit

Const fieldCount = 4

Sub import()
    Application.ScreenUpdating = False

    Dim fileNumber As Integer
    Dim data As String
    Dim curCol As Long, curRow As Long
    Dim dataCols As Long
    Dim i As Long
    Dim sh As Excel.Worksheet
    Dim arr() As String
    Dim hasCarriageReturn As Boolean

    fileNumber = FreeFile()
    Open "C:\test.txt" For Input As #fileNumber
    curCol = 1
    curRow = 1
    Set sh = ThisWorkbook.Worksheets("Sheet1")

    While Not EOF(fileNumber)
        ' if we reached the "correct" last column, then move to next row
        If (curCol > fieldCount) Then
            curCol = 1
            curRow = curRow + 1
            hasCarriageReturn = False
        End If

        Line Input #fileNumber, data
        arr = Split(data, vbTab)
        dataCols = UBound(arr)



        If (dataCols = fieldCount - 1) Then
            ' full row has no carriage returns
            hasCarriageReturn = False

            For i = 0 To dataCols
                sh.Cells(curRow, curCol).Value = arr(i)
                curCol = curCol + 1
            Next

        ElseIf (dataCols = 0 And hasCarriageReturn = True) Then
            ' if there is only 1 value in the row, append it to the current column
            sh.Cells(curRow, curCol - 1).Formula = sh.Cells(curRow, curCol - 1).Formula & Chr(10) & arr(0)

        ElseIf (dataCols = 0 And hasCarriageReturn = False) Then
            ' carriage return begins in the first field
            sh.Cells(curRow, curCol).Formula = sh.Cells(curRow, curCol).Formula & Chr(10) & arr(0)
            curCol = curCol + 1
            hasCarriageReturn = True

        ElseIf (hasCarriageReturn) Then
            ' append first item to field 3, then rest goes in other columns
            sh.Cells(curRow, curCol - 1).Formula = sh.Cells(curRow, curCol - 1).Formula & Chr(10) & arr(0)
            For i = 1 To dataCols
                sh.Cells(curRow, curCol).Value = arr(i)
                curCol = curCol + 1
            Next

            hasCarriageReturn = False

        Else
            ' process row and note that it has carriage returns
            For i = 0 To dataCols
                sh.Cells(curRow, curCol).Value = arr(i)
                curCol = curCol + 1
            Next

            hasCarriageReturn = True
        End If

    Wend

    Application.ScreenUpdating = True
End Sub
于 2013-06-24T13:59:37.027 に答える
2

当分の間、私がしたことは.. gvim(「vi」と同じ)を使用し、すべてを置き換えました

\t"\t" (これは、フィールドを引用符で囲むことです..そして..例:%s/\t/"\t"/g

\r\nwith "\r (これは、行末に引用符を付けるための実際の行末を持つことです:%s/\r\n/"\r/g

line start ^20with (これは引用符で囲ま^"20 れた行の最初のフィールドの先頭です...行は2013で始まります...したがって、"2013で置き換えます...):%s/^2013/"2013/g

ファイルを保存しました.. file.txtとして

エクセルを開く

ファイル... を選択し、Shift キーを押しながら [開く] をクリックします (提供: Import multiline csv files into Excel internationally )

すべてのフィールドが (一般的な形式で) 適切にインポートされ、複数行が正しく処理され、正しいフィールドに配置されます。

これは本当に素晴らしいことです...ただし、注意点が 1 つあります。

一部のフィールドはテキストですが、先頭に 0 が付いてい'000327511'ます'032'。「shift + open」メソッドを使用して先頭の 0 を保持できません。

通常のテキスト インポート ウィザードを使用すると、複数行が機能しなくなり、22 の状況が発生します。残念!!!

ただし..これは、誰かが永続的な修正をすべて見つけるまでの一時的な解決策です。コードはまったく関係ありません... vi に置き換えてクリック.. クリックするためのいくつかの入力だけです..

誰かがこの方法を少し改善できることを願っています。

于 2013-06-25T15:11:05.257 に答える