从文本文件中读取行到.csv

时间:2014-01-07 04:12:50

标签: batch-file csv ffmpeg

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

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

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

我一直在尝试不同的事情而且它只是不起作用。

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

4 个答案:

答案 0 :(得分:1)

只需使用内置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!

答案 1 :(得分: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 :(得分:0)

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

  1. 看起来每条记录最多有9行(用于边界测试)
  2. 您希望循环遍历单个文件中的多个记录:result.txt
  3. 您希望将每条记录三行提取到csv类型文件中,以便以后在Excel中使用。
  4. 我已将脚本设置为在写入输出文件时删除“genre =”“title =”和“episode_id =”。它还应该在csv中返回结果,如下所示:

    运动,IRWX_TV_Vol_01_1_Pt_4,0101

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

      

    C:\目录名\路径> cscript results.vbs

    流速:

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

    2. 然后循环遍历整个文件,按顺序搜索每个必需的变量(它将开始寻找类型,然后它将查找标题,然后查找episode_id。

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

    4. 如果脚本超过流派但在九行文本后没有找到标题行,则表示该记录无效并将扫描重置为流派(我希望这是有意义的)。

    5. Results.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
      

答案 3 :(得分:0)

另一种方式:

@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