我尝试导入的制表符分隔文本文件如下所示(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列的最佳方法是什么:
有没有人知道解决方案。非常感谢。
其他评论
请注意,我所拥有的仅是生成的文本文件...如此消息的最顶部所示....第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 ...然后单击打开..使用多行显示文件。
但是没有引号打开文件..不起作用..它会中断。
我不知道为什么举行轮班工作。我从这里就知道了这一点:Import multiline csv files into Excel internationally
现在..还有待回答......
1)如何在导入Excel之前以更简单的方式在文本文件周围添加引号...为什么Shift Open有效?如果我想使用文本导入向导控制每个分隔的列,该怎么办?
2)如何在SQL Server 2015中默认情况下在字段周围添加引号。这是对Q1以上的补充。我们仍然需要一个无法再次导出文件的解决方案。但是,对于任何新的出口......有人可以从Q2获得答案。
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"
(这是将字段包装在引号中..
:%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。