jneyxwry 发表于 2010-4-7 12:41:14

读LRC歌词中的歌词作为变量逐步输出

我有一个lrc歌词文件,里面的内容如下格式:







萧闳仁 - 连贝多芬都想告诉你
www.51lrc.com ▓ 李泽昊
歌词吾爱 带你心飞

我的抽屉 沾满灰尘
有多久没整理
浓浓哀伤在叹息
我拿起了笔 写了古典
第一乐章 我想告诉你
我快要听不清楚
非得要像休止符
黑不拉几要断断续续
连贝多芬 也都爱上你
你说分开最美丽
好! 我还想乐章在继续
爱来爱去 爱不过是病
连贝多芬 都想告诉你
耳聋了 更有意义
也许你只是下雨下在我的青草地
等放晴了 就自然蒸发



我现在想把歌词按时间方式一个一个做为变量按时间输出到txt文本中。不知道可不可以实现?读的时候要把 []之内的数据都去掉的。

afan 发表于 2010-4-7 12:43:25

这个有意思,应该不难,不过我现在没空,回头再弄

jneyxwry 发表于 2010-4-7 12:49:36

谢谢你哦,我从昨天弄到现在了。没搞定。在论坛潜水快2年了。第一次发帖。希望有个结果。

afan 发表于 2010-4-7 13:13:56

回复 3# jneyxwry


    你最好把要输出的样式举例出来~

jneyxwry 发表于 2010-4-7 20:58:00

$dir = @ScriptDir&"\123.lrc"
$ti = "设置"
HotKeySet("{F1}","tian")
$i = 0
While 1
        Sleep(100)
WEnd       

Func tian()
        $a = WinExists($ti)
        If $a = 1 Then
                $var = IniReadSection($dir,"config")
                If Not @error Then                       
                        $i += 1

                        ControlSetText ($ti, "", 'Edit2', $var[$i] )
                          ControlClick ($ti, "", 'Button1')
                        If $i = $var Then $i = 0
                EndIf       
        Else
                MsgBox(0,'提示','指定窗口“'&$ti&'”不存在,请检查!')
        EndIf       
EndFunc       


我这些代码是网上找的,感觉用起来很不爽啊要把东西都删掉。      就是读lrc文件。然后直接一行一行的写到 "设置" 窗口里的Edit2 里。

afan 发表于 2010-4-7 21:40:44

$dir = @ScriptDir&"\123.lrc"
$ti = "设置"
HotKeySet("{F1}","tian")
$i = 0
While 1
        Sleep(100)
...
jneyxwry 发表于 2010-4-7 20:58 http://www.autoitx.com/images/common/back.gif

你这是做同步显示歌词,还是不用同步,只需全部输出就行?

C.L 发表于 2010-4-7 21:57:38

要按照里面的时间来输出才行的吧?我看不懂那些时间是怎么回事,要不我也写来玩玩。

afan 发表于 2010-4-7 22:42:24

本帖最后由 afan 于 2010-4-7 22:52 编辑

将一楼的歌词文本保存为 “连贝多芬都想告诉你.lrc”
;#include <Array.au3>
Local $lrc = '连贝多芬都想告诉你.lrc'
Local $str = FileRead($lrc)
Local $sR = StringRegExp($str, '\[\d\d:\d\d.\d\d\]', 3)
_ArraySort($sR)
Local $txt = '', $i, $_time
For $i = 0 To UBound($sR) - 1
        $_time = StringRegExpReplace($sR[$i], '(\[|\])', '\\$1')
        $txt &= StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1') & @CRLF
        ;以上是做整体输出演示用,如需输出单行,下行即可。如需同步时间,也只需加上匹配经过时间=$sR[$i]
        ;MsgBox(0, 0, StringRegExpReplace($str, '(?s).+?' & $_time & '(?:\[[^\]]+\])*([^\r]*).+', '$1'))
Next
MsgBox(0, 0, $txt)

C.L 发表于 2010-4-7 22:43:41

本帖最后由 C.L 于 2010-4-7 23:07 编辑

需要有些时间不知道是怎么回事,我去除了我不懂的,选懂的做了一个,挺好玩的,呵呵~~
我没写到文件里,建了个GUI的EDIT来显示,用的是事件模式,是为了可以随时结束,不被循环影响,时间为了看着快点,我调快了5倍,歌词前我加上了显示的时间,方便看,代码贴上来:
#include <GUIConstantsEx.au3>
#include <GUIConstantsEx.au3>
$str = _
                '' & @CRLF & _
                '' & @CRLF & _
                '' & @CRLF & _
                '' & @CRLF & _
                '萧闳仁 - 连贝多芬都想告诉你' & @CRLF & _
                'www.51lrc.com ▓ 李泽昊' & @CRLF & _
                '歌词吾爱 带你心飞' & @CRLF & _
                '' & @CRLF & _
                '我的抽屉 沾满灰尘' & @CRLF & _
                '有多久没整理' & @CRLF & _
                '浓浓哀伤在叹息' & @CRLF & _
                '我拿起了笔 写了古典' & @CRLF & _
                '第一乐章 我想告诉你' & @CRLF & _
                '我快要听不清楚' & @CRLF & _
                '非得要像休止符' & @CRLF & _
                '黑不拉几要断断续续' & @CRLF & _
                '连贝多芬 也都爱上你' & @CRLF & _
                '你说分开最美丽' & @CRLF & _
                '好! 我还想乐章在继续' & @CRLF & _
                '爱来爱去 爱不过是病' & @CRLF & _
                '连贝多芬 都想告诉你' & @CRLF & _
                '耳聋了 更有意义' & @CRLF & _
                '也许你只是下雨下在我的青草地' & @CRLF & _
                '等放晴了 就自然蒸发' & @CRLF
Opt("GUIOnEventMode", 1)
MsgBox (0,"原始Lrc文件",$str)
$Form = GUICreate("Test", 413, 566, @DesktopWidth / 2 - 150, @DesktopHeight / 2 - 320)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$Edit = GUICtrlCreateEdit("", 1, 8, 408, 550)
GUICtrlSetData(-1, "")
GUISetState()
$aStr = StringRegExp($str, "(\[.*\])([^\]]+)\r", 3)
$maxtime = $aStr
$out = ""
$t = TimerInit()
While 1
        For $i = 0 To UBound($aStr) - 1
                $time = StringRegExp($aStr[$i], "\[(.*?)\.", 3)
                If IsArray($time) Then
                        For $j = 0 To UBound($time) - 1
                                $tmptime = StringSplit($time[$j], ":")
                                $tagtime = $tmptime * 60 + $tmptime
                                If Round(TimerDiff($t) / 1000, 2) == Round($tagtime / 5, 2) Then
                                        $out &= $tmptime & ":" & $tmptime & @TAB & $aStr[$i + 1] & @CRLF
                                        GUICtrlSetData($Edit, $out)
                                        Sleep(200)
                                        If $tagtime == "329" Then
                                                Sleep (3000)
                                                GUICtrlSetData($Edit, $out & @CRLF & @TAB & "**********end**********")
                                                ExitLoop
                                        EndIf
                                EndIf
                        Next
                EndIf
        Next
WEnd

Func _exit()
        Exit
EndFunc   ;==>_exit

afan 发表于 2010-4-7 22:56:37

回复 9# C.L


    我也觉得这个话题有意思,呵呵

C.L 发表于 2010-4-7 22:58:31

回复 10# afan

是啊,挺有意思。
我看你的代码,你的正则真的很强大,佩服。

afan 发表于 2010-4-7 23:01:10

回复 11# C.L


    瞎掰的,呵呵~

C.L 发表于 2010-4-7 23:11:54

回复 12# afan

正则我没怎么去研究过,只懂一点点,不过我是偶尔用用,本着够用就好,够用就好(自我解嘲),呵呵~

afan 发表于 2010-4-7 23:16:57

回复 13# C.L


    我也差不多,一遍都没看完过,也就玩些常用的~

p.s, 运行了下你的代码,你完全可以整个歌词播放器玩玩了,呵呵

jneyxwry 发表于 2010-4-7 23:41:19

afan 哥的我好像运行不了。直接提示个0。就没了
页: [1] 2 3 4 5 6
查看完整版本: 读LRC歌词中的歌词作为变量逐步输出