【问题标题】:Open csv file delimited by pipe character "|" or not common delimiter打开由管道字符“|”分隔的 csv 文件或不常用的分隔符
【发布时间】:2013-07-24 11:25:20
【问题描述】:

我正在尝试设置一个 Excel VBA 代码,该代码可以打开一些 .csv 文件并将包含的信息拆分为列,并由字符 | 分隔。我设法打开了文件,但我使用的代码打开了我的文件,而不根据分隔符拆分文本。到目前为止,我已经尝试了以下代码:

Sub OpenCSV()

Dim wkbTemp As Workbook
Dim sPath As String, sName As String

sPath = ThisWorkbook.Path & "\CSV_Files\"
sName = "Test.csv"

Set wkbTemp = Workbooks.Open(Filename:=sPath & sName, Format:=6, Delimiter:="|")

End Sub

【问题讨论】:

标签: excel vba csv delimiter


【解决方案1】:

Rowan 的解决方案确实有效。关键是将他的解决方案中的文件名“Test.csv”替换为“\CSV_Files\”位置中的“Test.txt”。 “Test.txt”不应是逗号分隔的值类型。它应该是真正的 TXT 文件类型。

在 Windows 资源管理器中检查文件类型。确保它不是 CSV。如果您使用 CSV 类型,您实际上会告诉 Excel 数据是用逗号而不是管道分隔符解析的。

如果您的工作簿位于根目录中:c:\ 创建目录:C:\CSV_Files 将文本文件:Test.txt 放入目录\CSV_Files

在您的工作簿中打开 VBA 并复制下面的完整 VBA 代码。

完整的 VBA 代码应为:

Sub OpenCSV()

Dim wkbTemp As Workbook
Dim sPath As String, sName As String

sPath = ThisWorkbook.Path & "\CSV_Files\"
sName = "Test.txt"
 Workbooks.OpenText Filename:=sPath & sName, _
    Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
    xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
    , Comma:=False, Space:=False, Other:=True, OtherChar:="|"
Set wkbTemp = ActiveWorkbook

end sub

关闭 VBA 并运行宏。

【讨论】:

    【解决方案2】:

    我记得这让我发疯了一段时间。
    似乎 Excel 对.csv 文件有着不受控制的贪婪。如果你只是改变结尾(.txt.dat 或其他),它会起作用!

    【讨论】:

    • 感谢您的回复,我在VBA中设置了扩展更改,现在可以正常工作了!
    • 您是刚刚将字符串的“.csv”部分更改为“.txt”,还是在打开之前创建了一个新的文本文件来复制内容?
    • 这不会有任何区别(您可能只会在将内容复制到新文件时搞砸编码)。
    • 精确。我可以让 Workbooks.OpenText 与分号分隔的 .csv 一起使用的唯一方法是使用 Name 方法将文件名临时更改为 .txt,加载内容,然后最后将文件重命名为 .csv。
    【解决方案3】:

    我试过这样做。它不起作用。但是,如果您尝试对文本文件执行相同操作(通过将 csv 内容复制粘贴到文本文件中),它会起作用。

    如果你看MSDN Link,它在'workbooks.open'方法的'Delimiter'参数的描述中明确表示'如果它是一个文本文件'。也许这就是它不起作用的原因。

    我不确定。这对我来说也是新事物。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      试试看

      Delimiter:= Chr(124)
      

      字符 124 是管道“|”

      【讨论】:

        【解决方案5】:

        我认为这应该对你有所帮助。

        Sub OpenCSV()
        
        Dim wkbTemp As Workbook
        Dim sPath As String, sName As String
        
        sPath = ThisWorkbook.Path & "\CSV_Files\"
        sName = "Test.csv"
         Workbooks.OpenText Filename:=sPath & sName, _
            Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
            xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
            , Comma:=False, Space:=False, Other:=True, OtherChar:="|"
        Set wkbTemp = ActiveWorkbook
        
        end sub
        

        【讨论】:

          【解决方案6】:
          Option Explicit
          Private Sub Text2Excel()
          Dim excel_app As Excel.Application
          Dim max_col As Integer
          Dim txtFromFile As Variant
          Dim Sep As String
          
              'DoEvents
          
          Application.ScreenUpdating = False
          
              txtFromFile = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt," & _
                                                          "CSV Files (*.csv),*.csv")
              If txtFromFile = False Then
                  ''''''''''''''''''''''''''
                  ' user cancelled, get out
                  ''''''''''''''''''''''''''
                  Exit Sub
              End If
          
              Sep = Application.InputBox("Enter a separator character." & vbNewLine & "For TAB Delimited keep BLANK.", Type:=2)
          
              If Sep = vbNullString Then
                  ' user cancelled, get out
                 Sep = vbTab
              End If
          
              'Pull the data from test file to activesheet
          
              Workbooks.OpenText FileName:=txtFromFile, DataType:=xlDelimited, Other:=True, otherchar:=Sep, local:=True
          
              MsgBox "Data from selected file " & txtFromFile & " has been pulled to Excel.", vbInformation
          
          Application.ScreenUpdating = False
          
          End Sub
          

          【讨论】:

          • 你能补充一些解释吗?
          【解决方案7】:
          Sub CSVtoXLS()
          Dim xFd As FileDialog
          Dim xSPath As String
          Dim xCSVFile As String
          Dim xWsheet As String
          Dim xOtherChar As String
              Application.DisplayAlerts = False
              Application.StatusBar = True
              xWsheet = ActiveWorkbook.Name
              Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
              xFd.Title = "Select a folder:"
              If xFd.Show = -1 Then
                      xSPath = xFd.SelectedItems(1)
              Else
                  Exit Sub
              End If
              If Right(xSPath, 1) <> "\" Then xSPath = xSPath + "\"
              xCSVFile = Dir(xSPath & "*.csv")
              xOtherChar = InputBox("Please indicate delimiter:", "CSV file/Text to column Converter", ",")
              Do While xCSVFile <> ""
                  Application.StatusBar = "Converting: " & xCSVFile
                  Workbooks.OpenText Filename:=xSPath & xCSVFile, DataType:=xlDelimited, Tab:=True, Other:=True, OtherChar:=";"
                  ActiveWorkbook.SaveAs Replace(xSPath & xCSVFile, ".csv", ".xls", vbTextCompare), xlWorkbookDefault
                  ActiveWorkbook.Close
                  Windows(xWsheet).Activate
                  xCSVFile = Dir
              Loop
              Application.StatusBar = False
              Application.DisplayAlerts = True
          End Sub
          

          【讨论】:

            【解决方案8】:

            Workbooks.Open 的分隔符一直有问题,在某些 CSV 上它不能正常工作。

            所以对于这些工作表,我使用以下代码:

            用你的分隔符替换sDelimiter

            Dim sDelimiter as string: sDelimiter = "|"
            
            Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, Other:=True, OtherChar:=sDelimiter
            

            如果DisplayAlerts一直提示,则禁用(在使用TextToColumns之前禁用DisplayAlerts)

            Application.DisplayAlerts = False
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-27
              相关资源
              最近更新 更多