首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过宏导入CSV时日期格式不一致

通过宏导入CSV时日期格式不一致
EN

Stack Overflow用户
提问于 2016-11-29 20:42:16
回答 2查看 1.3K关注 0票数 1

我对Excel VBA完全是个新手。我最近设法将以下宏安装到我的个人工作簿中,以便只需单击一个按钮即可导入CSV文件(选择必要的选项):

代码语言:javascript
运行
复制
Sub OpenTextFile()

   filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
   If filetoopen = Null Or filetoopen = Empty Then Exit Sub

   Workbooks.OpenText Filename:=filetoopen, _
   Origin:=65001, DataType:=xlDelimited, Comma:=True

End Sub

它起作用了。然而,它并不总是有效的。我将它用于不同的CSV文件(所有这些文件都是在ISO 8601日期系统中预先格式化的),但我得到了不同的结果。在其中一些文件中,日期输出是DD/MM/YYYY hh:mm,但在另一些文件中,它是我无法理解的奇怪内容(比如00:00,0或50:00,0)。我可以手动选择行内容并将格式更改为长日期,因此至少我确信excel将数据识别为日期,而不是文本。

如何确保所有日期的格式相同?这依赖于什么?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-11-29 20:57:42

导入到excel中时,不同的日期格式是出了名的,因为windows本地化(具有默认的分隔符、日期和数字格式)可能很难处理。

不要仅仅为了导入一个文件而搞乱windows本地化。

在重复导入csv-Files时,我使用以下方法:

  1. I为有问题的csv文件设置schema.ini-file。有关更多信息,请参见this
  2. I for

代码语言:javascript
运行
复制
- query the csv-File with SQL and ADODB, which allows for a simple `SELECT *` simple pre-processing (reordering columns, filtering records, ...). I can output the resulting ADODB.Recordset into my workbook OR
- I set up a linked table in my workbook an ADODB.Connection. The data can be updated with a simple macro or right-click.

无论哪种方式:国际海事组织与schema.ini-Files合作有以下优势

  • 允许您处理任何日期和数字格式,而无需调整您的excel工作簿或vba-code
  • simple和透明结构,可读的
  • 一组设置。每个excel工作表或数据库都可以使用相同的schema.ini-file来处理数据。

编辑:这可以提供一个起点。

  1. 在存储csv
  2. 的文件夹中创建一个名为csv的新文本文件,并在记事本(或更好的: Notepad++)中打开,将以下内容粘贴到其中

yourfile.csv CharacterSet = ANSI ColNameHeader = FALSE Format = Delimited(;) DateFormat = "DD.MM.YYYY“DateTimeFormat = "DD.MM.YYYY hh:nn,ss”Col1 = yourdatefield Col2 = somelongfield Long

  • 在阅读完后调整以下内容

代码语言:javascript
运行
复制
- filename
- format (what delimiter, or is it fixed)
- DateFormat and/or DateTimeFormat. Realize that minutes are `nn` instead of the common `mm`
- your desired column-headers and the columns data-types. You need `ColNameHeader = FALSE` for this.

在VBA中设置一个ADO连接,使您能够运行语句并向ADO-recordsets.

  1. run返回如下所示的
    1. 语句

使用记录集的SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv

  • work

注意:您提到了一些混合的时间-十进制书写(50:00,0)。只要列中的任何数字引用时间单位,例如秒或分钟,则将字段声明为DateTime-field是没有问题的。

但是:如果像00:00,50这样的东西表示半分钟而不是50秒,则可能需要将其作为文本读取,然后在Import-SQL中使用FORMAT()LEFT()等SQL语句进行转换

票数 2
EN

Stack Overflow用户

发布于 2016-11-30 20:06:54

解决方法:问题不在于Excel,而在于为我提供CSV文件的服务。显然,他们有两个选项可以从他们的网站上下载CSV,而且他们的日期格式也不同。其中一个正确地使用了ISO8601,而另一个则在日期字符串的末尾添加了".0“,因此Excel将其转换为文本字符串。

无论如何,感谢所有人的回复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40866225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档