在.txt文件中找到日期并格式化它们

时间:2017-11-08 18:38:30

标签: string vba date formatting

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

我们获得了一个.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)

这在Do Until循环中是否可行?或者更好的是有一个单独的功能来处理那个部分。无论哪种方式,我甚至不知道从哪里开始在这样的文件中操作日期而不仅仅是变量

编辑:这是一些.csv文件

BOF

11/1/2017 12:08:21 PM

3

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

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

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

EOF

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以做的一件事是将原始行拆分为列,然后您只需要考虑第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格式作为您所在位置的标准格式。