使用vb脚本从csv转换为excel后,小数分隔符丢失

使用vb脚本从csv转换为excel后,小数分隔符丢失,excel,csv,vbscript,Excel,Csv,Vbscript,我有一个带有分号分隔符的CSV,我想将其转换为常规Excel工作表。我用下面的代码成功地做到了这一点,但我一定犯了一个错误,因为原始文件中带有小数且不以零开头的数字在Excel中显示为没有小数分隔符的数字。当我在Excel中手动打开CSV时,结果会很好,因此这一定是使用脚本进行操作的副作用 例如: 在CSV中有一行: 2013-03-10 17:00:15;闲置的2,272298;; 0121860 在Excel工作表中,这将成为: 2013-03-10 17:00闲置2.272.298 012

我有一个带有分号分隔符的CSV,我想将其转换为常规Excel工作表。我用下面的代码成功地做到了这一点,但我一定犯了一个错误,因为原始文件中带有小数且不以零开头的数字在Excel中显示为没有小数分隔符的数字。当我在Excel中手动打开CSV时,结果会很好,因此这一定是使用脚本进行操作的副作用

例如:

在CSV中有一行:

2013-03-10 17:00:15;闲置的2,272298;; 0121860

在Excel工作表中,这将成为:

2013-03-10 17:00闲置2.272.298 0121860

在excel中手动打开会显示:

2013-03-10 17:00闲置2272298 0121860

有人能告诉我我可以/应该做些什么来将小数保留为Excel中的小数吗?可能是告诉Excel哪个符号表示十进制分隔符的一种方法,或者是强制它使用欧洲格式的参数

你好,尼科

这是我当前拥有的脚本,
csvFile
是一个字符串,包含原始文件的完整路径,
excelFile
是一个字符串,包含我要存储新excel工作表的位置的完整路径

Set objExcel = CreateObject("Excel.Application")                   'use excel  
objExcel.Visible = true                                            'visible  
objExcel.displayalerts=false                                       'no warnings 

objExcel.Workbooks.Open(csvFile)                                   'open the file  
objExcel.ActiveWorkbook.SaveAs excelFile, -4143, , , False, False  'save as xls  
objExcel.Quit                                                      'close excel

在csvFile所在的文件夹中创建一个schema.ini文件,并根据给定的规则对其进行描述


进一步阅读:,

有几种可能的方法,我将介绍一种我喜欢的方法:

  • 开始录制宏
  • 创建新工作簿
  • 从该工作簿转到Data>From Text,在那里选择CSV文件,然后可以执行有关值分隔符、小数分隔符、千分隔符的所有必需设置。还可以为每列选择特定的数据类型
  • 添加CSV内容后,转到数据>连接并删除 连接。数据将保留在工作表中,但没有 不再需要活动连接
  • 以xls名称保存工作簿
  • 停止录音

  • 现在根据您的喜好调整脚本。

    一般来说,Excel尊重系统的区域设置。然而,CSV导入有时会对“正确”的格式有自己的想法,特别是当导入的文件具有扩展名
    .CSV

    我想试试下面的方法。将文件重命名为
    .txt
    .tsv
    并按如下方式导入:

    objExcel.Workbooks.OpenText csvFile, , , 1, 1, False, False, True
    

    我到处找工作。现在,我创建了一个CSV文件的副本,在该副本中,我将所有逗号替换为数字加点。虽然不是很有效,但它确实给了Excel想要的东西,对于像我这样没有经验的程序员来说,它足够简单。 在这样做的时候,一所大学要求我删除第一列(本例中的时间戳)中的空格和重复值的条目

    结果就是这个脚本

        'csvFile   is a string with the full path to the file. e.g. "C:\\Program Files\\Program\\data.csv"
        'tempFile  is a string with the full path to the file. e.g. "C:\\Temp\\temp.csv"
        'excelfile is a string with the full path to the file. e.g. "D:\\Data\\sheet.xls"
    
        Set fs=CreateObject("Scripting.FileSystemObject")
        Set writeFile = fs.CreateTextFile(tempFile,True)
        Set readFile = fs.OpenTextFile(csvFile)
    
        ' regular expression to remove leading whitespaces
        Set regular_expression = New RegExp
            regular_expression.Pattern = "^\s*"
            regular_expression.Multiline = False
    
        ' regular expression to change the decimal seperator into a point        
        Set regular_expression2 = New RegExp
            regular_expression2.Global = True
            regular_expression2.Pattern = ",(?=\d)"
            regular_expression2.Multiline = False
    
        'copy the original file to the temp file and apply the changes
        Do Until readFile.AtEndOfStream
            strLine= readFile.ReadLine
            If (StrComp(current_timestamp,Mid(strLine, 1, InStr(strLine,";")),1)<>0) Then
            If (Len(previous_line) > 2) Then
                previous_line = regular_expression2.replace(previous_line,".")
                writeFile.Write regular_expression.Replace(previous_line, "") & vbCrLf
            End if
            End if
            current_timestamp = Mid(strLine, 1, InStr(strLine,";"))
            previous_line = strLine
        Loop
        readFile.Close
        writeFile.Close
    
        Set objExcel = CreateObject("Excel.Application")    ' use excel
        objExcel.Visible = true                             ' visible
        objExcel.displayalerts=false                        ' no warning pop-ups
        objExcel.Workbooks.Open(tempFile)                   ' open the file
        objExcel.ActiveWorkbook.SaveAs excelfile, -4143, , , False, False   'save as excelfile
        fs.DeleteFile tempFile                              ' clean up the temp file
    
    ”csvFile是一个包含文件完整路径的字符串。e、 g.“C:\\Program Files\\Program\\data.csv”
    'tempFile是一个包含文件完整路径的字符串。e、 g.“C:\\Temp\\Temp.csv”
    'excelfile是一个包含文件完整路径的字符串。e、 g.“D:\\Data\\sheet.xls”
    设置fs=CreateObject(“Scripting.FileSystemObject”)
    Set writeFile=fs.CreateTextFile(tempFile,True)
    设置readFile=fs.OpenTextFile(csvFile)
    '正则表达式以删除前导空格
    设置正则表达式=New RegExp
    正则表达式.Pattern=“^\s*”
    正则表达式。多行=False
    '正则表达式将小数分隔符更改为点
    设置正则表达式2=newregexp
    正则表达式2.Global=True
    正则表达式2.Pattern=“,(?=\d)”
    正则表达式2.Multiline=False
    '将原始文件复制到临时文件并应用更改
    直到readFile.AtEndOfStream
    strLine=readFile.ReadLine
    如果(StrComp(当前时间戳,Mid(strLine,1,InStr(strLine,“;”),1)0),则
    如果(Len(上一条线)>2),则
    上一行=常规表达式2.替换(上一行“.”)
    writeFile.Write正则表达式.Replace(上一行“”)&vbCrLf
    如果结束
    如果结束
    当前时间戳=Mid(strLine,1,InStr(strLine,“;”))
    前一行=strLine
    环
    readFile.Close
    写文件,关闭
    使用Excel设置objExcel=CreateObject(“Excel.Application”)”
    objExcel.Visible=true“可见”
    objExcel.displayalerts=false“无警告弹出窗口
    objExcel.Workbooks.Open(tempFile)'打开文件
    objExcel.ActiveWorkbook.SaveAs excelfile,-4143,,False,False'另存为excelfile
    fs.DeleteFile tempFile“清理临时文件
    

    我希望这对其他人也有用。

    谢谢您的输入,这听起来是一个很好的解决方案,但不幸的是excel表中的值仍然是错误的。为了以防万一,我使用的是excel 2003。我认为这会起作用,但是我在使用vb脚本修改Excel生成的复杂代码方面还不够熟练。