使用多行单元格导入制表符分隔的文本文件(到Excel或Access)

时间:2013-06-24 11:16:50

标签: excel text-files tab-delimited

我尝试导入的制表符分隔文本文件如下所示(4个字段,字段3是多行)...以及大约100,000行数据:

下面只是一个示例......但是请提供一个通用的解决方案,其中多行文字可以在多个字段中...比如fld3,fld6和fld7总共10个字段。

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

Tab是哪里,(CR)是回车。将制表符分隔文本文件导入Excel时,我希望字段3(字段3.1,字段3.2和字段3.3)中的所有3行都在一个单元格中,但是多行。所以基本上我希望excel在Field 3中忽略回车。我该怎么办?

对于您的信息... 文本字段不是双引号 ...请告诉我将纯文本制表符分隔文本文件转换为Excel 4列的最佳方法是什么:

Excel File

有没有人知道解决方案。非常感谢。

其他评论

请注意,我所拥有的仅是生成的文本文件...如此消息的最顶部所示....第2行中的文本“Field 3.2”,“Field 3.3”和“Field 4”在第3行中将它们分开。

同样......不一定,场3将始终是多线的......它可能是多行的,有2,3或更多行...甚至没有或单行。字段3本身永远不会有用。

有关测试人员的示例文件的其他评论 - 更新25Jun2013 09:05 UTC

请注意复制粘贴不起作用..因为标签丢失了......你必须自己添加它。

在多行字段周围带引号的文件:

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 ...然后单击打开..使用多行显示文件。

capture 2 with quotes

但是没有引号打开文件..不起作用..它会中断。

我不知道为什么举行轮班工作。我从这里就知道了这一点:Import multiline csv files into Excel internationally

现在..还有待回答......

1)如何在导入Excel之前以更简单的方式在文本文件周围添加引号...为什么Shift Open有效?如果我想使用文本导入向导控制每个分隔的列,该怎么办?

2)如何在SQL Server 2015中默认情况下在字段周围添加引号。这是对Q1以上的补充。我们仍然需要一个无法再次导出文件的解决方案。但是,对于任何新的出口......有人可以从Q2获得答案。

3)任何其他可能更简单的方法?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

暂时我做的是..使用gvim(与'vi'相同)并替换所有

带有\t

"\t"(这是将字段包装在引号中.. .then ..例如:%s/\t/"\t"/g

带有\r\n

"\r(这是为了让真正的行结束在最后有一个引用.. 。然后例如:%s/\r\n/"\r/g

^20 一起开始^"20(这是针对引号中第一行字段的开头...行以2013开头...所以替换为“2013 ... )例如:%s/^2013/"2013/g

将文件保存为。file.txt

打开Excel

选择文件...并按住shift并点击“打开”(由Import multiline csv files into Excel internationally提供)

所有字段都很好地导入(通用格式),并且正确处理多行并将其放入正确的字段中。

这真是太棒了...... 但有一点需要注意。

某些字段是文字,但前导为0 ..例如'000327511''032' ..我希望前导零完整..没有excel转换为数字。我无法使用“shift + open”方法保留前导0。

如果我使用普通文本导入向导...则无法使多线工作..捕获22情况。可惜!!!

然而..这是一个很好的临时解决方案,直到有人可以找到永久修复所有。 根本没有涉及代码...只需要输入一些代替vi并单击..单击..

希望有人能稍微改进这种方法。

答案 2 :(得分:0)

导入Libre Office Calc。 Libre Office Calc不会将两个选项卡之间的换行符解释为下一行命令。换行后的内容将出现在同一单元格的下一行中。将电子表格保存为ms excel xls / xlsx格式。 忽略在保存之前弹出的警告,风险自负和/或在导入后校对相同的电子表格。在校对期间,请确保使用Excel。