我有一个.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
减去上面看到的变量,“=”和空格问题。
我一直在尝试不同的事情而且它只是不起作用。
希望有人在这里可以看到问题并提供帮助,谢谢
答案 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可能更容易。所以无论如何,我根据你原来的问题做了假设:
我已将脚本设置为在写入输出文件时删除“genre =”“title =”和“episode_id =”。它还应该在csv中返回结果,如下所示:
运动,IRWX_TV_Vol_01_1_Pt_4,0101
将此代码保存为results.vbs或与result.txt文件位于同一目录中的某些内容(或更新inputFileName / outputfilename下列出的位置)并从命令提示符运行,如下所示:
C:\目录名\路径> cscript results.vbs
流速:
脚本尝试打开“result.txt”
然后循环遍历整个文件,按顺序搜索每个必需的变量(它将开始寻找类型,然后它将查找标题,然后查找episode_id。
当脚本构建结果时,一旦找到episode_id,它会将找到的记录详细信息写入results.csv并重置为搜索类型。
如果脚本超过流派但在九行文本后没有找到标题行,则表示该记录无效并将扫描重置为流派(我希望这是有意义的)。
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