Autohotkey 将数字转换为时间戳(在特定位置插入冒号)

Autohotkey 将数字转换为时间戳(在特定位置插入冒号),autohotkey,Autohotkey,我使用自动热键,因为代码对我来说是最容易理解的。所以我有一个带有数字和文本的文档,例如 120344text 234000text文本 并且期望的输出是 12:03:44text 23:40:00text文本 我确信StrReplace可以用来插入冒号,但我不确定如何指定冒号的位置或让AHK“查找”6位数字的特定字符串。以前,我会突出显示要应用StrReplace的文本,然后按下热键,但我想知道是否有更有效的方法来实现这一点,而不需要我的交互。即使只是指向我需要研究的相关函数也会很有帮助!非常感

我使用自动热键,因为代码对我来说是最容易理解的。所以我有一个带有数字和文本的文档,例如

120344
text

234000
text文本

并且期望的输出是

12:03:44
text

23:40:00
text文本

我确信StrReplace可以用来插入冒号,但我不确定如何指定冒号的位置或让AHK“查找”6位数字的特定字符串。以前,我会突出显示要应用StrReplace的文本,然后按下热键,但我想知道是否有更有效的方法来实现这一点,而不需要我的交互。即使只是指向我需要研究的相关函数也会很有帮助!非常感谢,我对编程还是很陌生。

假设“时间戳”组件总是6个字符长,并且总是在字符串的开头,这个解决方案应该可以正常工作

    String test = "012345 test test test";
    test = test.substring(0, 2) + ":" + test.substring(2, 4) + ":" + test.substring(4, test.length());
这将输出
01:23:45测试

为什么??因为您正在临时创建一个长度为两个字符的
字符串
对象,然后在获取下一对之前插入冒号。最后,附加
字符串
的其余部分,并将其分配给所需的
字符串
变量。请记住,
子字符串
方法不会修改调用该方法的
字符串
对象。此方法返回一个“新的”
String
对象。因此,变量
test
在赋值操作结束之前不会被修改

或者,您可以使用
StringBuilder
并按如下方式附加每个组件:

StringBuilder sbuff = new StringBuilder();
sbuff.append(test.substring(0,2));
sbuff.append(":");
sbuff.append(test.substring(2,4));
sbuff.append(":");
sbuff.append(test.substring(4,test.length()));
test = sbuff.toString();

你也可以用一个“奇特的”循环来实现这个,但我认为对于这样简单的事情来说,循环只是过火了。哦,我差点忘了,这应该适用于您的两个测试字符串,因为在最后一次冒号插入之后,代码会将子字符串从索引位置4一直不加区分地带到字符串的末尾。

hfontanez的回答非常有助于了解,对于这个问题,我必须使用循环和子字符串函数。我相信,编写这段代码的方法要简单得多,但这是我的最终版本:

Loop, read, C:\[location of input file]
{
  { If A_LoopReadLine = ;
   Continue ; this part is to ignore the blank lines in the file
  }
  { 
    one := A_LoopReadLine
    x := SubStr(one, 1, 2)
    y := SubStr(one, 3, 2)
    z := SubStr(one, 5)
    two := x . ":" . y . ":" . z
    FileAppend, %two%`r`n, C:\[location of output file]
   }
}
return