首先,我知道关于格式化日期有一百万个问题,但我找不到符合我情况的解决方案。
我们获得了一个.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
答案 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
格式作为您所在位置的标准格式。