我的问题的一些背景知识:
我有一个由 MS Access 中的查询创建的 CSV 文件。 CSV 文件的主体包含列;姓名、地址、邮政编码、日期等。文件的最后一行包含数据摘要;文件名、日期、时间戳和记录总数。由于所有字段都包含字符串,并且我们不希望系统截断或尝试评估日期和邮政编码,因此我们用引号输出这些字段。
最后两行看起来像这样:
"Name","Code","Address","Address2","Office","Location","City","State","PostCode","Date"
"FileName","DDMMYYYY","HH:MM:SS",TotalRecords,"","","","","",""
我需要删除最后一行中多余的逗号,使其看起来像这样:
"FileName","DDMMYYYY","HH:MM:SS",TotalRecords
我已经查看并尝试了这里的解决方案: CSV 文件有多余的逗号
这将创建我的原始文件的副本,但保留所有逗号完好无损。如果我删除所有引号,此解决方案就有效。
如果您使用的是 Excel,则可以在 VBA 中执行这一行:
left(Activecell.text,len(trim(replace(replace(activecell.Text,","," "),""""," "))))
我会从中间开始解释:
replace(replace(activecell.Text,","," "),""""," ")
用空格替换所有逗号和双引号
trim(replace(replace(activecell.Text,","," "),""""," "))
修剪它,即删除开头和结尾的空格
len(trim(replace(replace(activecell.Text,","," "),""""," ")))
获取修剪文本的长度
left(Activecell.text,len(trim(replace(replace(activecell.Text,","," "),""""," "))))
最后给我原始字符串的左侧部分,其中字符数设置为我们计算出的长度减去开头和结尾的逗号和双引号。
如果字符串以未知数量的逗号或未知数量的:
,""
例如:
whatever,,,,,,,"","",,,,"",""
然后这段VBA代码将删除那些垃圾:
Sub StringCleaner()
Dim s1 As String, sTest As String, sOut As String
s1 = "," & Chr(34) & Chr(34)
sTest = "whatever" & ",,,,,," & s1 & s1 & ",,," & s1 & s1
sOut = sTest
While Right(sOut, 1) = "," Or Right(sOut, 3) = s1
If Right(sOut, 1) = "," Then sOut = Mid(sOut, 1, Len(sOut) - 1)
If Right(sOut, 3) = s1 Then sOut = Mid(sOut, 1, Len(sOut) - 3)
Wend
MsgBox sTest & vbCrLf & sOut
End Sub
感谢大家的帮助。
我使用了不同的途径来解决我的问题。我创建了一个批处理脚本,用于提取记录并将数据重新打印到新文件中,并省略文件末尾的额外逗号。
我的代码如下,欢迎任何改进它的批评。
echo off
setlocal EnableDelayedExpansion
pause
set cur=0
FOR /F "delims=" %%A in (input.csv) DO (
set line=%%A
set line=!line:,,=, ,!
FOR /F "tokens=1-11 delims=," %%G in (^"!line!^") DO (
if "%%G"=="" (echo.)
if "%%G"==""FILENAME"" (
echo %%G,%%H,%%I,%%J >> test_%date:~-4,4%%date:~-7,2%%date:~-10,2%.csv
goto EOF
) else (
echo %%G,%%H,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q >> test_%date:~-4,4%%date:~-7,2%%date:~-10,2%.csv
)
set /a cur=cur+1
)
)
:EOF
echo %cur%
pause
我也遇到过这个问题。这通常是因为另一列的最后一列有空格。 (在您的案例列中 TotalRecords 之后)
尝试在 Excel 中打开并突出显示并删除 TotalRecords 之后的列,然后重试。
您可能有很多以下带有空格的列,这可能由以下列的数量决定