【问题标题】:rename csv filename whith the name in file用文件中的名称重命名 csv 文件名
【发布时间】:2014-06-01 19:08:40
【问题描述】:

我希望你能帮助我。 我有很多 csv 文件 (90000) 我需要用文件中的名称更改文件名。 在这个例子中,我想搜索第二行的第 13 个分隔符,我们在其中找到“020/NOT-232032/2013”​​,然后用这个名称重命名 csv 文件。 有什么方法可以用 Powershell、VBS、cmd 或其他方式来实现吗? 请帮忙 谢谢

示例 File1.csv --> 020-NOT-232032-2013.doc :

文件1.csv

第一行:

"statoDoc","idDoc","tipoCliente","tipoDoc","idUtente","oraDoc","indirizzo","idTerminale","ragioneSociale","codiceFiscale","idClienteSede","idCessionario" ,"nrDoc","dataFirma","localita","partitaIva","firmatario","idDestinatario","dataDoc"

第2行

"C","232032","","NOT","020","00:19","CASTELLO DI FE","020","PANI c","00624330221","200673" ,"","020/NOT-232032/2013","2013.08.20","CASTE MME","IT00624330221","","102796","2013.08.20"

【问题讨论】:

  • 你能贴出你目前尝试过的代码吗?
  • 一个典型的用例。
  • 您是否只对 CSV 中的第一行数据感兴趣?

标签: powershell csv vbscript cmd rename


【解决方案1】:

以下是使用 PowerShell 的两种可能的解决方案:

导入 csv 数据。更容易阅读。

Get-ChildItem -Filter "*.csv" -Path "c:\folderwithCSVs" -Recurse | % {
    $filename = (Import-Csv $_.FullName)[0].nrDoc.Replace('"',"").Replace("/","-").Trim() + ".doc"
    Rename-Item -Path $_.FullName -NewName $filename
}

使用文本解析。推荐用于大型 csv 文件。

Get-ChildItem -Filter "*.csv" -Path "c:\folderwithCSVs" -Recurse | % {

    #Open file
    $reader = New-Object System.IO.StreamReader $_.FullName

    #Ignore first line
    $reader.ReadLine() | out-null

    #Get name
    $filename = $reader.ReadLine().Split(",")[12].Replace('"',"").Replace("/","-").Trim() + ".doc"

    #Close stream
    $reader.Close()

    #Rename file
    Rename-Item -Path $_.FullName -NewName $filename

}

【讨论】:

    【解决方案2】:

    你需要一个计划。

    1. 如何访问文件?你可以循环遍历一个文件夹中的文件吗?递归遍历一个文件夹树?多个起始目录?
    2. 给定一个文件(对象) - 你能确定它是否应该被处理吗?延期?文件名格式?已经处理了吗?
    3. 对于要处理的文件:打开,跳过第一行,读取第二行,在“,”上拆分(如果“,”是有效数据,则有风险;可能使用为,"020/NOT-232032/2013", 设计的正则表达式),将字段转换为名称, 关闭, 重命名
    4. VBScript 中的转换:

    wtf

    >> fld = """020/NOT-232032/2013"""
    >> nam = Replace(Mid(fld, 2, Len(fld) - 2), "/", "-") & ".doc"
    >> WScript.Echo fld, "=>", ">" & nam & "<"
    >>
    "020/NOT-232032/2013" => >020-NOT-232032-2013.doc<
    

    【讨论】:

      【解决方案3】:

      这是一个 VBScript 选项:

      Option Explicit
      Dim objFSO 'File System Object
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      Dim objDir
      Set objDir = objFSO.GetFolder("C:\MyFiles")
      Dim objFile
      Const ForReading = 1
      
      For Each objFile In objDir.Files
          If(UCase(Mid(objFile.Name, InStrRev(objFile.Name, "."))) = ".CSV") Then
              Dim objFileTS
              Set objFileTS = objFSO.OpenTextFile(objFile.Path, ForReading, False)
              objFileTS.SkipLine()
              Dim strToken
      
              'Read the second line, split it into an array on the "," char, and get the
              '13th token in the array (array's are zero-indexed, so it's the 12th index).
              strToken = Split(objFileTS.ReadLine(), ",")(12)
      
              'remove quotes.
              strToken = Replace(strToken, Chr(34), "")
      
              'replace "/" with "-".
              strToken = Replace(strToken, "/", "-")
      
              objFileTS.Close()
              Dim strNewPath
              strNewPath = Left(objFile.Path, InStrRev(objFile.Path, "\")) & strToken & ".doc"    
              objFile.Move(strNewPath) 'move to the same place with a different name is the only way to rename.
          End If
      Next
      

      【讨论】:

      • 如果 CSV 中的数据包含带逗号的字符串,这将不起作用。例如123,456,"jones,dave",789
      • @Jobbo 指出限制很有用,并且 OP 可以决定它是否适用于他们,考虑到示例数据在引号中没有逗号,投票有点极端..
      【解决方案4】:

      这是一个扩展 @roryap 答案的 VBS 解决方案

      Option Explicit
      
      Const PATH = "C:\folder\where\csvs\sit"
      
      Dim fso, file
      Dim cn,rs
      Dim val
      
      Set cn = CreateObject("ADODB.Connection")
      Set fso = CreateObject("Scripting.FilesystemObject")
      
      'HDR = yes because your first row is data headers
      cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & PATH & ";" & _
                "Extended Properties=""text;HDR=YES;FMT=Delimited"""
      
      For Each file in fso.GetFolder(PATH).Files
        Set rs = cn.Execute("Select * From [" & file.name & "]")
      
        Do While Not rs.EOF
          val = rs.Fields.Item("nrDoc").Value 
      
          If Not isNull(val) Then
            val = Replace(val,"/","")
            file.Move Left(file.Path, InStrRev(file.Path, "\")) & val & ".doc" 
            Exit Do
          End If
      
          rs.MoveNext
        Loop 
      
      Next
      
      
      WScript.Quit
      

      当它在第 13 个槽中找到一个值时,它将使用它,然后忽略该 CSV 的其余部分,并移动到下一个 CSV

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-19
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多