使用多行单元格导入制表符分隔的文本文件(到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列这样的:
有没有人知道一个解决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键并点击打开..用多行显示文件。
但是打开没有引号的文件..不起作用..它打破了。
我不知道为什么控股转移的作品。 我从这里知道这一点: 在国际上将多行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。