【问题标题】:reading lines from txt file into .csv将 txt 文件中的行读入 .csv
【发布时间】:2014-01-07 04:12:50
【问题描述】:

我有一个使用 ffmpeg 通过批处理文件创建的 .TXT 文件。它返回以下信息(更多但试图缩短)

major_brand=isom 
minor_version=512 
compatible_brands=isomiso2avc1mp41 
creation_time=1970-01-01 00:00:00 
encoder=Lavf53.19.0 
genre=sport 
track=1 
title=IRWX_TV_Vol_01_1_Pt_4 
episode_id=0101 

.TXT 文件带有上述 3 个。好吧,我希望能够只使用上面的一些信息,然后我想创建一个 .CSV 文件,以便我可以加载到 .XLS 文件中

我已经使用了以下,并且很接近:

REM now lets get info we need from result.txt
pause 

REM checks how many times finds genre and loops that many times
FOR /f "delims=" %%b IN ('findstr "genre" result.txt') DO (
for %%f in (result.txt) do (
    set i=0

for /F "delims= tokens=2,3*" %%l in (%%f) do (
    set /A i+=1
    set line!i!=%%l

)
echo  !line9!, !line6!, !line8!,  >> result.csv
)
) 
pause 

这将返回以下内容:

 title=IRWX_TV_Vol_01_1_Pt_4 , genre=sport, episode_id=0101
 title=IRWX_TV_Vol_01_1_Pt_4 , genre=sport, episode_id=0101
 title=IRWX_TV_Vol_01_1_Pt_4 , genre=sport, episode_id=0101

仅 .TXT 文件中的第一个视频标题,而不是每个视频标题

而且我希望它像这样回来:

 IRWX_TV_Vol_01_1_Pt_4,sport,0101

减去您在上面看到的变量、“=”和空格问题。

我一直在反复尝试不同的东西,但它不起作用。

希望这里有人能看到问题并提供帮助,谢谢

【问题讨论】:

  • 如果您单独处理每个日志部分,而不是一次处理 3 组,这将特别容易。您的批处理文件是否允许您处理文件之间的登录,因此您一次只能处理一组信息?

标签: batch-file csv ffmpeg


【解决方案1】:

这些解决方案假定所有实例都存在所有三个值。

假设您的文件中从未有 ! 字符:

@echo off
setlocal enableDelayedExpansion

>result.csv (
  for /f "tokens=1* delims==" %%A in (result.txt) do (
    set "%%A=%%B"
    if %%A equ episode_id echo !title!,!genre!,!episode_id!
  )
)

如果您确实需要担心文件中的!:

@echo off
setlocal disableDelayedExpansion

>result.csv (
  for /f "tokens=1* delims==" %%A in (result.txt) do (
    set "%%A=%%B"
    if %%A equ episode_id (
      setlocal enableDelayedExpansion
      echo !title!,!genre!,!episode_id!
      endlocal
    )
  )
)

【讨论】:

  • 这很好用,但我如何摆脱每个末尾的空间?
【解决方案2】:

只需使用内置的arrays:

@ECHO OFF &SETLOCAL enabledelayedexpansion
for /f "tokens=1*delims==" %%a in (result.txt) do (
    if "%%a"=="major_brand" set /a varcnt+=1
    set "%%a!varcnt!=%%b"
)
for /l %%a in (1 1 %varcnt%) do echo(!title%%a!,!genre%%a!,!episode_id%%a!

【讨论】:

    【解决方案3】:

    我确信有一种方法可以在批处理文件中执行此操作,但由于没有一个批处理文件大神参与进来,我提供了一个 VBSCript 替代方案 - 我个人认为 VBScript 可能更容易。所以无论如何,我已经根据你原来的问题做出了假设:

    1. 看起来每条记录最多有 9 行(用于边界测试)
    2. 您想在一个文件中循环遍历多个记录:result.txt
    3. 您希望将每条记录的三行提取到一个 csv 类型的文件中,以便以后在 excel 中使用。

    我已将脚本设置为在写入输出文件时去除“genre=”“title=”和“episode_id=”。它还应该在 csv 中返回结果,如下所示:

    运动,IRWX_TV_Vol_01_1_Pt_4,0101

    将此代码另存为 results.vbs 或与 result.txt 文件位于同一目录中的内容(或更新 inputFileName / outputfilename 下列出的位置)并从命令提示符运行,如下所示:

    C:\Directoryname\path> cscript results.vbs

    流程:

    1. 脚本尝试打开“result.txt”

    2. 然后循环遍历整个文件,按顺序搜索每个需要的变量(它会开始寻找 Genre,然后寻找 title,然后是 episode_id。

    3. 在脚本构建结果时,一旦找到 episode_id,它会将找到的记录详细信息写入 results.csv 并重新设置为搜索类型。

    4. 如果脚本超越了流派,但在 9 行文本后仍未找到标题行,则假定记录无效并将扫描重置为流派(我希望这是有道理的)。

    结果.vbs

    Option Explicit
    Const ForReading = 1, ForAppending = 8
    Dim fso, objFile, inputFileName, outputFilename, vars, countflag, strData, linData, recCount, linCount
    
    ' Customizable variables ---------------------
    inputFilename  = "result.txt"
    OutputFilename = "result.csv"
    vars = Array("genre", "title", "episode_id")
    recCount = 9    ' Max of 9 lines to check until reset (incase of invalid record)
    ' ---------------------------------------------------------
    
    countflag = 0
    linCount = 1
    lindata = ""
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set objFile = fso.OpenTextFile(inputFileName, ForReading)
    
    Do Until objFile.AtEndOfStream
       strData = objFile.ReadLine
    
       If InStr(LCase(strData), LCase(vars(countflag))) Then
           strdata = Mid(strData, Len(vars(countflag))+2, Len(strData)-2)
           lindata = lindata & Trim(strdata) & ","
           countflag = countflag + 1
       End If
       lincount = lincount + 1
       If countflag > ubound(vars) then
           countflag = 0
           lincount = 1
           WriteText OutputFilename, Mid(linData, 1, Len(linData)-1)
           linData = ""
       Else
           If linCount > recCount Then
              countflag = 0
              linCount = 1
              lindata = ""
           End If
       End If
    Loop
    objFile.Close
    
    Function WriteText(strFile, oText)
        Dim outFile
        set outFile = fso.OpenTextFile(strFile, ForAppending, True)   
        outfile.Writeline (oText)
        outfile.Close
    End Function
    

    【讨论】:

    【解决方案4】:

    另一种方式:

    @echo off&cls
    setlocal EnableDelayedExpansion
    for /f "delims=" %%a in (result.txt) do (
       set $test=%%a
       set %%a
       if /i "!$test:~0,10!"=="episode_id" echo !title!, !genre!, !episode_id!)
    endlocal
    

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多