Board logo

标题: [文本处理] lrc歌词提取问题 [打印本页]

作者: netdzb    时间: 2021-6-21 07:23     标题: lrc歌词提取问题

[00:01.10]许茹芸 - 独角戏
[00:02.10]词:许常德
[00:03.10]曲:季忠平
[00:48.96]是谁导演这场戏
[00:53.32]在这孤单角色里
[00:56.72]对白总是自言自语
[00:59.47]对手都是回忆
[01:01.58]看不出什么结局

===============

我的目的是转成srt歌词。
直接写出成品,我现在没有能力写。

我想分成三步走,第一步生成一个临时文件

许茹芸 - 独角戏
词:许常德
曲:季忠平
是谁导演这场戏
在这孤单角色里
对白总是自言自语
对手都是回忆
看不出什么结局

==============================

第二步生成这个临时文件,如果实现了这两步,后面的代码可能我会写了。

[00:01.10]  --->  [00:02.10]
[00:02.10]  --->  [00:03.10]
[00:03.10]  --->  [00:48.96]
[00:48.96]  --->  [00:53.32]
[00:53.32]  --->  [00:56.72]
[00:56.72]  --->  [00:59.47]
[00:59.47]  --->  [01:01.58]
[01:01.58]  --->
作者: xp3000    时间: 2021-6-21 08:29

  1. //&cls&dir /b *.lrc|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. function reStr(file){
  3.     var f = fso.opentextfile(file, 1);
  4.     str = f.ReadAll()
  5.     .replace(/^(\[[0-9]{2}:[0-9]{2}.[0-9]{2}\])([^\[]+)\r\n(\[[0-9]{2}:[0-9]{2}.[0-9]{2}\])/gm, '$1  --->  $3$2\r\n$3')
  6.     .replace(/^(\[[0-9]{2}:[0-9]{2}.[0-9]{2}\])([^\[]+)\r\n(\[[0-9]{2}:[0-9]{2}.[0-9]{2}\])/gm, '$1  --->  $3$2\r\n$3')
  7.     .replace(/^(\[[0-9]{2}:[0-9]{2}.[0-9]{2}\])([^\[>]+)(\r\n)*$/mg, '$1  ---> $2$3');
  8.     f.Close();
  9.     var f = fso.opentextfile(file, 2);
  10.     f.Write(str);
  11. }
  12. var fso = new ActiveXObject('Scripting.FileSystemObject');
  13. while(!WScript.StdIn.AtEndOfStream)reStr(WScript.StdIn.ReadLine());
复制代码
传闻你在学习VBS?
作者: netdzb    时间: 2021-6-21 08:59

回复 2# xp3000

对的正在学习中,谢谢你啊。我一会研究一下代码。
作者: newswan    时间: 2021-6-21 19:00

本帖最后由 newswan 于 2021-6-21 19:03 编辑

powershell
  1. $file = "1.txt"
  2. $fc = Get-Content $file
  3. for ($i=0 ; $i -lt $t.count -1 ; $i++){
  4.     $fc[$i].Substring(0,10) + "--->" + $fc[$i+1].Substring(0,10) + " " + $fc[$i].Substring(10)
  5. }
  6. $fc[-1]
复制代码
最后一行的结束时间怎么办?
作者: went    时间: 2021-6-21 19:37

test.bat
  1. @echo off & cd /d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. for %%i in (*.lrc) do (
  4. (
  5. cd.>"%%~ni.src"
  6. for /f "usebackq tokens=1* delims=[]" %%a in ("%%i") do (
  7. if not "!lastTime!"=="" (
  8. echo !lastTime! ---^> %%a
  9. )
  10. set "lastTime=%%a"
  11. echo %%b >> "%%~ni.src"
  12. )
  13. echo !lastTime! ---^>
  14. )>"%%~ni.time"
  15. echo done. %%i
  16. )
  17. pause&exit
复制代码

作者: netdzb    时间: 2021-6-21 21:27

回复 4# newswan

最后一行加的2秒如何啊?
作者: netdzb    时间: 2021-6-21 21:28

回复 5# went

我要认真的看一下批处理是如何时间戳的?
作者: went    时间: 2021-6-21 21:59

回复 7# netdzb


    不是时间戳,这只是普通的文本
作者: newswan    时间: 2021-6-22 00:06

本帖最后由 newswan 于 2021-6-22 02:09 编辑
  1. $fc = Get-Content "1.txt"
  2. for ($i=0 ; $i -lt $t.count -1 ; $i++){
  3.     $fc[$i] = $fc[$i].Substring(0,10) + " ---> " + $fc[$i+1].Substring(0,10) + " " + $fc[$i].Substring(10)
  4. }
  5. $tt = $fc[-1].Substring(1,8)
  6. $tt = [datetime]::ParseExact($tt, 'mm:ss.ff', $null).addseconds(2).tostring("mm:ss.ff")
  7. $tt = "[" + $tt + "]"
  8. $fc[-1] = $fc[-1].Substring(0,10) + " ---> " + $tt + " " + $fc[$i].Substring(10)
  9. $fc
复制代码
格式固定,字符串截取方便
作者: qixiaobin0715    时间: 2021-6-22 06:17

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=[]" %%a in (test.lrc) do (
  4.     if defined str1 (
  5.         set /a n+=1
  6.         echo,!n!&echo,!str1! ---^> %%a&echo,!str2!&echo,
  7.     )
  8.     set "str1=%%a"
  9.     set "str2=%%b"
  10. )
  11. set /a n+=1
  12. echo,!n!&echo,!str1! ---^> &echo,!str2!&echo,
  13. )>test.srt
  14. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2