【问题标题】:Trailing commas at the end of a data extract in CSVCSV 中数据提取末尾的尾随逗号
【发布时间】:2021-05-25 01:05:20
【问题描述】:

关于我的问题的一点背景:

我有一个由 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 file has extra commas

这会创建我原始文件的副本,但会保留所有逗号。如果我删除所有引号,则此解决方案有效。

【问题讨论】:

  • 该文件由一个不受我控制的系统使用,它不喜欢额外的逗号。手动编辑文件是一种选择,但我希望有一个不需要人工输入的干净解决方案。
  • @teylyn 为什么你会建议在 stackoverflow 上手动编辑文件? O__o
  • @DylanHunt 是的,差不多两年后,我的建议是将 CSV 文件加载到 Power Query 中并删除不需要的列。但除此之外,我完全愿意花几天时间编写需要 5 分钟手动完成的代码。

标签: excel vba csv


【解决方案1】:

如果您在 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,","," "),""""," "))))

最后给我原始字符串的左边部分,其中字符数设置为我们计算出的长度减去开头和结尾的逗号和双引号。

【讨论】:

    【解决方案2】:

    如果字符串以未知数量的逗号或未知数量的逗号结尾:

    ,""
    

    例如:

    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
    

    【讨论】:

      【解决方案3】:

      感谢大家的帮助。

      我使用了不同的方法来解决我的问题。我创建了一个批处理脚本,它提取记录并将数据重新打印到一个新文件中,省略了文件末尾的额外逗号。

      我的代码如下,任何改进它的批评,不胜感激。

      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
      

      【讨论】:

        猜你喜欢
        • 2018-05-11
        • 2012-05-20
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 2022-08-21
        • 2021-01-25
        • 2018-01-10
        相关资源
        最近更新 更多