【问题标题】:Locate Dates within .txt file and Format them在 .txt 文件中找到日期并对其进行格式化
【发布时间】:2018-04-21 14:02:58
【问题描述】:

首先,我知道有一百万个关于格式化日期的问题,但我还没有找到适合我情况的解决方案。

我们得到一个 .csv 文件,由于要求,我们必须通过几种方式修改该文件。

首先,我们在文件上运行 VBA,以便将分隔符从“,”更改为“|” (我们有这个工作)使用:

Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\Users\Z00393885\Desktop\csvStuff\"&myVar, ForReading)

count = 0
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    strReplacer = Chr(34) & "," & Chr(34)
    strLine = Replace(strLine, strReplacer, "|")
    strLine = Replace(strLine, chr(34), "")
    strNewText = strNewText & strLine & vbCrLF
    count = count + 1
Loop
Print (count - 1)
objFile.Close

Set objFile = objFSO.OpenTextFile("C:\Users\Z00393885\Desktop\csvStuff\"&myVar, ForWriting)

objFile.WriteLine "BOF" & vbCrLF & now() & vbCrLF & (count - 1) & vbCrLF & strNewText & "EOF"

objFile.Close

第二个要求是给我带来麻烦的要求,我必须查找存在的每个日期(它们的格式为:11/8/2017 1:30 EST 并且位于第 10 列和第 11 列内)并格式化日期,使其为 2017 年 8 月 11 日(我们需要删除时间,并确保日期和月份只有一个数字时为 0)

这在“直到”循环中可行吗?还是有一个单独的功能来处理那部分会更好。无论哪种方式,我什至不确定从哪里开始在这样的文件中操作日期,而不仅仅是一个变量

编辑:这里是一些 .csv 文件

转炉

2017 年 11 月 1 日下午 12:08:21

3

课程代码|主组织|...|发布日期|生效日期|...|网址

123|TAD 网站|...|10/31/2017 00:00:00 EDT|11/14/2017 00:00:00 EDT|...|http://URL

456|DAT 站点|...|11/5/2017 00:00:00 EDT|11/5/2017 00:00:00 EDT|...|http://URL

EOF

【问题讨论】:

  • 是的,在Do Until 循环中是可能的;没有理由两次处理文件。你有什么具体问题?我没有看到任何迹象表明您已经努力自己解决了这个问题。
  • 请将源 .csv 文件的标题行和几条记录复制并粘贴为文本。
  • @KenWhite 我所拥有的只是一个关于如何去做这件事的想法。我的想法是遍历每一行,因为我已经有了这个,并寻找斜线符号,并根据它们相距多远,添加一个零?正如我所说,只是一个想法,因为除了更改分隔符之外我没有进行文件操作的经验
  • 您需要在这里完成四个相对简单的任务:1) 找到日期。 2)将其复制到变量中。 3)将其修改为您需要的格式。 4)把它放回字符串中。所以从第一个任务开始。当你有完成它的代码时,添加第二个,然后是第三个,然后是最后一个。编程就是把事情分解成小任务,编写代码来完成这些任务,然后把它们放在一起完成工作。所以从任务 #1 开始。弄清楚你将如何在代码中找到日期值。
  • @KenWhite 感谢您的建议,我已经编程了一段时间,但是当我还没有遇到语言/情况时,我仍然会迷失在要采取的步骤中,我会尝试解决它

标签: string vba date formatting


【解决方案1】:

您可以做的一件事是将原始行拆分为列,然后您只需要考虑第 10 列和第 11 列:

Dim myArray() As String
'...
strLine = objFile.ReadLine
'Current delimiter is quote-comma-quote
strReplacer = Chr(34) & "," & Chr(34)
'Replace current delimiter with a pipe delimiter
strLine = Replace(strLine, strReplacer, "|")
'Remove any remaining quote marks
strLine = Replace(strLine, Chr(34), "")
'Split line using pipe delimiter
myArray = Split(strLine, "|")
'Convert column 10
myArray(9) = Format(CDate(Left(myArray(9), InStr(myArray(9), " ") - 1)), "mm/dd/yyyy")
'Convert column 11
myArray(10) = Format(CDate(Left(myArray(10), InStr(myArray(10), " ") - 1)), "mm/dd/yyyy")
'Join line back together with pipe delimiter
strLine = Join(myArray, "|")
'Create one huge string containing all lines in file
strNewText = strNewText & strLine & vbCrLF
'...

要将其用作 VBScript,需要进行一些小的更改:

'Dim myArray() As String
Dim myArray
'...
strLine = objFile.ReadLine
'Current delimiter is quote-comma-quote
strReplacer = Chr(34) & "," & Chr(34)
'Replace current delimiter with a pipe delimiter
strLine = Replace(strLine, strReplacer, "|")
'Remove any remaining quote marks
strLine = Replace(strLine, Chr(34), "")
'Split line using pipe delimiter
myArray = Split(strLine, "|")
'Convert column 10
'myArray(9) = Format(CDate(Left(myArray(9), InStr(myArray(9), " ") - 1)), "mm/dd/yyyy")
myArray(9) = FormatDateTime(CDate(Left(myArray(9), InStr(myArray(9), " ") - 1)), 0)
'Convert column 11
'myArray(10) = Format(CDate(Left(myArray(10), InStr(myArray(10), " ") - 1)), "mm/dd/yyyy")
myArray(10) = FormatDateTime(CDate(Left(myArray(10), InStr(myArray(10), " ") - 1)), 0)
'Join line back together with pipe delimiter
strLine = Join(myArray, "|")
'Create one huge string containing all lines in file
strNewText = strNewText & strLine & vbCrLF
'...

我自己不使用 VBScript,但我相信FormatDateTime 函数会给你你想要的输出。它似乎是特定于语言环境的,但我假设您使用 mm/dd/yyyy 格式作为您所在位置的标准格式。

【讨论】:

  • Split 功能正是我所需要的,谢谢!唯一不幸的是,有些字段确实包含逗号和引号,使我无法被逗号分割。此外,每个字段都有引号,它们被 2 个替换行删除
  • 这就是说,我是否应该运行第二个 Do Until 循环,按管道拆分?这样,不应该删除多余的逗号或引号
  • 刚刚意识到这一行: strLine = Replace(strLine, chr(34), "") 可能会导致问题并删除该字段中的引号,有没有办法解决这个问题?这些行: strReplacer = Chr(34) & "," & Chr(34) & strLine = Replace(strLine, strReplacer, "|") 会为我处理它并删除第二个 Replace 行吗? (对不起cmets的弹幕)
  • 啊 - 我错过了 - 您当前正在将字符串 "," 更改为 | - 我已经读到了,因为您只是将 , 更改为 |。我想我只需要重新排序一些行。给我一秒钟,我将发布答案的更新。
  • @johno - 好的,我不得不把你的大部分代码放回去。:D 然后拆分/转换/加入只是被添加到代码的末尾。
【解决方案2】:

您是否考虑过运行“文本到列”功能,只需将格式更改为日期列,然后输出文件?这可能比搜索字符并按照您的方式更改它们要容易得多。

With Range(pass the range here)
.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(..., ...),_
    TrailingMinusNumbers:=True

Columns("x:x").NumberFormat = "mm/dd/yyyy"

您可以从这里保存文件。

编辑:

一个警告:您需要将最终得到的列数硬编码到数组中。

例如,如果文件的每一行包含 4 个部分,您可以使用:

Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:=True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2012-11-03
    • 2021-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多