【问题标题】:Extract a variable string from a .txt file [closed]从 .txt 文件中提取变量字符串 [关闭]
【发布时间】:2018-01-18 16:52:19
【问题描述】:

我们有一个客户使用我们的一些设备并输出一个特定的字符串,我们将其用作诊断。

但是,有问题的客户使用了他们自己的日志记录系统,该系统在输出文件中填充了许多与我们无关的随机内容。

我所追求的是在不同位置提取一个变量字符串并将这些提取的字符串放入一个新的文本文件中。

这是我所追求的变量 sting:

*X;3;194; 0;2;125;0;0012;32;0;261D3;??

如前所述,此文本可能因内容而异,但始终以 *X 开头,通常不超过 38 个字符(包括空格和 ;)

文本的一个例子是......

2018-01-15 11:16:43.566 pid=2800 tid=17 ResultReader [INFO ] packet received: *X;3;194; 0;2;126;0;0012;32;0;26357;??
2018-01-15 11:16:43.566 pid=2800 tid=17 ResultReader [ERROR] Device reset - Critical error: BALL_IN_THE_SAME_DIRECTION_WITH_WHEEL_ROTOR
2018-01-15 11:16:43.567 pid=2800 tid=17 events [INFO ] EmitEvent - RolWheelStatusRelayMsg{PreviousPacket=Protocol: EXTENDED, State: FINISH_BETTING, GameCount: 194, WinningNumber: 0, WarningFlags: [BALL_IN_THE_SAME_DIRECTION_WITH_WHEEL_ROTOR], RotorSpeed: 12, RotorDirection: CLOCKWISE, ExtendedFlags: [ROTOR_RUNNING_AT_LEGAL_SPEED, ROTOR_ROTATING_CLOCKWISE], SpinCounter: 49, BallDirection: CLOCKWISE, BallSpeed: 12, BallInPocketPosition: -1, Packet=Protocol: EXTENDED, State: FINISH_BETTING, GameCount: 194, WinningNumber: 0, WarningFlags: [BALL_IN_THE_SAME_DIRECTION_WITH_WHEEL_ROTOR], RotorSpeed: 12, RotorDirection: CLOCKWISE, ExtendedFlags: [ROTOR_RUNNING_AT_LEGAL_SPEED, ROTOR_ROTATING_CLOCKWISE], SpinCounter: 50, BallDirection: CLOCKWISE, BallSpeed: 12, BallInPocketPosition: -1}
2018-01-15 11:16:44.067 pid=2800 tid=17 ResultReader [INFO ] packet received: *X;3;194; 0;2;126;0;0012;32;0;26357;??

中间的文字可能会有所不同,但目标仍然相同。我不介意如何但需要对可以并且可能具有不同信息的不同文件是可执行的。 (如果有道理的话).

【问题讨论】:

  • 那么你有没有尝试过什么?
  • 你能定义一个正则表达式来捕获这个字符串吗?例如。 regex101.com/r/XjjNoF/1
  • 你的字符串是否总是以双问号结尾(??)?
  • 为什么是C# 和Python?不要使用标签发送垃圾邮件
  • 我很困惑。你是说你对一个以编码为重点的网站要求你有一定程度的编码知识感到惊讶?即使您对编码一无所知,您仍然可以进行搜索并表明您至少尝试过。 SO 旨在成为您遇到困难时尝试的最后一个资源,而不是您甚至不确定要使用哪种语言时的第一个资源。祝你好运,希望你能找到你需要的东西:-)

标签: c# python batch-file scripting


【解决方案1】:

如果使用正则表达式,以下内容将为您完成...

/\*X.*\?\?/g

确定字符串的开头 (\*X),然后匹配任何字符 0 次或多次 (.*),直到出现双问号 (\?\?)。

最初的 * 字符和 ?符号被转义以防止其默认含义被解释。

【讨论】:

    【解决方案2】:

    我可能会这样做:

    import re
    
    with open('logfile.txt') as f: # assuming your log file name is logfile.txt...
        for line in f:
            ret = re.search('X.{36,40}\n$', line) # Here I take all starting with X, 36 to 40 length string and ending with a newline
            if ret is None:
                continue
            extracted_var = ret.group(0).strip()
            print(extracted_var)
    

    使用您的日志文件样本输出:

    X;3;194; 0;2;126;0;0012;32;0;26357;??
    X;3;194; 0;2;126;0;0012;32;0;26357;??
    

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 2013-06-28
      • 2013-07-03
      • 1970-01-01
      • 2021-07-07
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多