使用vb脚本从csv转换为excel后,小数分隔符丢失
我有一个带有分号分隔符的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哪个符号表示十进制分隔符的一种方法,或者是强制它使用欧洲格式的参数 你好,尼科 这是我当前拥有的脚本,使用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
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文件,并根据给定的规则对其进行描述
进一步阅读:,有几种可能的方法,我将介绍一种我喜欢的方法:
现在根据您的喜好调整脚本。一般来说,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生成的复杂代码方面还不够熟练。