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

我试图导入的制表符分隔的文本文件看起来像这样(4场,场3是多行)…和大约100,000行的数据:

下面只是一个示例…但请给出一个通用的解决scheme,其中多行文本可以在多个领域…就像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忽略字段3中的回车。我该怎么做?

对于你的信息… 文本字段不是双引号 …请告诉我什么是最好的方式将纯文本制表符分隔文本文件转换为Excel 4列这样的:

Excel文件

有没有人知道一个解决scheme。 这将不胜感激。

额外的评论

请注意,我所拥有的仅仅是所产生的文本文件…,如在该消息的最顶部所显示的那样….第2行中的字段“3.2”,第3行中的“字段3.3”和“字段4”与他们分开。

另外…不一定是场3将总是多线…它可能是多行,2,3或更多的行…甚至没有或单行。 场3本身永远不会有。

额外的评论与示例文件的人来testing – 更新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键并点击打开..用多行显示文件。

用引号捕捉2

但是打开没有引号的文件..不起作用..它打破了。

我不知道为什么控股转移的作品。 我从这里知道这一点: 在国际上将多行CSV文件导入到Excel中

现在..它仍然有待回答…

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

2)如何在SQL Server 2015默认情况下在字段中添加引号。这是上面的第一季度的补充。 我们仍然需要一个解决scheme,我们不能再次导出文件。 但是,对于任何新的出口..有人可以从第二季度用户的答案。

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

这是我想出来的。 如果你能保证最后一列永远不会有回车,那么这应该工作正常。

这样做是读取VBA中的文本文件,并将其带入工作簿。 您必须指定有多less字段(在testing场景中,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 

暂时我所做的是..使用gvim(像'vi'一样),并取代所有

\t"\t" (这是为了将字段用引号括起来 ..例如:%s/\t/"\t"/g

\r\n"\r (这是为了让真正的行结尾有一个报价结束..然后例如:%s/\r\n/"\r/g

行开始^20^"20 (这是在行首字段在引号…行开始于2013年…所以用”2013年…“取代)例如:%s/^2013/"2013/g

保存文件..作为file.txt

打开Excel

select文件…并按住Shift并点击“打开”(承蒙:将多行CSV文件导入到Excel中 )

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

这真是太棒了…… 不过有一点需要注意。

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

如果我使用正常的文本导入向导…那么多行不能工作..赶上22的情况。 可怜!!!

然而..这是一个很好的临时解决scheme,直到有人能find一个永久性的解决scheme。 根本没有涉及的代码…只需要input几个字符来replacevi,然后点击。

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

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