【问题标题】:Opening a CSV file with semicolon delimiter打开带有分号分隔符的 CSV 文件
【发布时间】:2019-03-29 15:38:30
【问题描述】:

我有一个简单的宏需要打开一个带有分号分隔符的 .csv 文件,但是当我运行我的代码时,所有数据都在第一列中,字符串中有 ;,但没有分隔。

我为 workbooks.open 方法尝试了不同的可选设置。下面我包括了我最近的尝试。 我的区域设置是英语(英国),, 作为数字分组分隔符,. 作为小数分隔符。

到目前为止我的代码:

Sub OpenCSV()

Dim FilePath as String
Dim LikeFile as String

FilePath = " C:\" ' Name of file path to fetch data from
LikeFile = Dir(FilePath & "*.csv")    ' Finding file 
        If LikeFile <> "" Then
            Workbooks.Open Filename:=FilePath & LikeFile, Format:=4, Delimiter:=";", ReadOnly:=True, Local:=True
        End if
End sub

我的实际结果是它打开文件没有分隔。

我的 .csv 文件片段:

Nav as per;基金 ID;基金名称;股票类型;货币;ISIN 代码;价格 (NAV);总资产净值;优秀;Tis;Tid;份额 ccy;分享价格; TNA 份额 ccy;汇率 20190321;XX9999;NamedFund;EUI;美元;XX123123;204.563000000;165061156.750000000;806896.369000000;;欧元;180.070000000;145293919.06;1.136050000 20190321; XX9999; NamedFund; EUR; USD; XX123124; 193.437000000; 352547.160000000; 1822.538000000 ;;; EUR; 170.270000000; 310327.15; 1.136050000 20190321; XX9999; NamedFund; USI; USD; XX123125; 104.942000000; 37779152.540000000; 360000.000000000 ;;;;;; 20190321;XX9999;NamedFund;USR;USD;XX123126;0.000000000;0.000000000;0.000000000;;;;;;

【问题讨论】:

  • 你能发布几行 CSV 数据的样本吗?
  • 一般来说,IMPORT 一个非标准的 csv 文件比OPEN 它更容易。然后你可以很容易地指定各种东西,包括分隔符。在执行宏时录制宏以获得各种选项。根据您的 Excel 版本,最好使用 VBA 或 Power Query (Get&Transform)。

标签: excel vba csv


【解决方案1】:

听起来你需要使用 .TextToColumns;它可以指定以分号分隔,例如:

Columns(1).TextToColumns DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=True, Comma:=False, Space:=False, Other:=False

编辑1:

请注意,您必须修复您的数据,因为它将显示为文本字符串,例如,对您的数字执行循环并乘以 1...存在于源数据中:

With sws 'source worksheet
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    For i = 2 To lr
        .Cells(i, 6).Value = Val(.Cells(i, 6).Value) * 1 'Uses column 6 (F)
    Next i
End With

【讨论】:

    【解决方案2】:

    如果您在导入之前以编程方式将 .CSV 重命名为 .TXT,则分隔导入效果会更好:

    Private Sub CSVimportV2()
        Dim wb As Workbook
        Dim tmpFilename As String
        Dim myPath As String
    
        myPath = Application.DefaultFilePath & "\example.csv"
    
        ' delete .txt without questioning
        tmpFilename = Left(myPath, InStrRev(myPath, ".")) & "txt"
        If Dir(tmpFilename) <> "" Then Kill tmpFilename
    
        ' copy .csv as additional .txt
        FileCopy myPath, tmpFilename
    
        ' open .txt as new workbook
        Set wb = Workbooks.Open( _
            Filename:=tmpFilename, _
            UpdateLinks:=0, _
            ReadOnly:=True, _
            format:=4, _
            Password:="", _
            WriteResPassword:="", _
            IgnoreReadOnlyRecommended:=False, _
            Origin:=xlWindows, _
            Delimiter:=";", _
            Editable:=True, _
            Notify:=True, _
            Converter:=2, _
            AddToMru:=False, _
            Local:=True, _
            CorruptLoad:=xlNormalLoad)
    
        ' delete .txt
        If Dir(tmpFilename) <> "" Then Kill tmpFilename
    
        ' save it als xlsx
        wb.Sheets(1).UsedRange.EntireColumn.AutoFit
        wb.SaveAs Left(myPath, InStrRev(myPath, ".")) & "xlsx", xlOpenXMLWorkbook
    End Sub
    

    如果你的小数分隔符没有被正确识别,请适配Local(可以是TrueFalse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      相关资源
      最近更新 更多