批处理文件从txt文件中删除前18个字符

时间:2015-07-09 01:26:10

标签: java windows batch-file

我有一个包含超过32,000行评论机器代码的.txt文档。它看起来像这样:

Display menu window
C0/000E:    E220        SEP #$20
C0/0010:    C210        REP #$10
C0/0012:    20640B      JSR $0B64
C0/0015:    20750B      JSR $0B75
C0/0018:    C220        REP #$20
C0/001A:    A90001      LDA #$0100

为了编译目的,我需要按如下方式转换代码:

; Display menu window
SEP #$20
REP #$10
JSR $0B64
JSR $0B75
REP #$20
LDA #$0100

具体来说,这意味着:

  • 空行必须保持不变。
  • 如果一行以" C0 /&#34开头;然后删除前18个字符,包括标签。
  • 否则,它是一个函数标题,所以在开头添加一个分号后跟一个空格(非强制性)。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

因此,以下代码(这是在java btw中)将从您提供的文件中读取文本,处理它,如果行以C3/开头,将打印删除前18个字符的行,开始和结束时的白色空间被修剪掉了。如果该行不以C3/开头,则该行将按原样打印。 (仅供参考这个java代码在处理你庞大的文本文件方面可能比批处理文件更快,这就是为什么我首先推荐java:P)

import java.io.*;


public class ClassName{
    public static void main(String args[])throws IOException{
        PrintWriter file_out = new PrintWriter("OutputFileName.txt");
        BufferedReader br = new BufferedReader(new FileReader("OriginalFileName.txt"));

        String line, temp, out = "";
        while((line = br.readLine()) != null){
            temp = line.substring(0,3);
            if(temp.equals("C3/")){
                out = line.substring(18, line.length()).trim();

                file_out.println(out);

            }else{
                file_out.println(line);
            }



        }
        file_out.close();
    }

}

当然,将OutputFileName.txtOriginalFileName.txt替换为您的文本文件。要编译并运行它,您需要安装并设置JDK。要了解如何执行此操作,请click here。您还可以在Web上找到有关如何设置和使用JDK的大量其他教程。设置JDK后,将此代码保存为ClassName.java,编译并运行它。确保将此程序保存在与输入/输出文件相同的文件夹中。

注意:通常情况下我不会发出这样的代码,但我感到很无聊并且感觉很好:)

另外,我强烈建议您尝试使用java自己编程。它是一种非常有趣和多才多艺的语言。如果您有任何其他问题,请随时告知我们:D。

示例输入:

Display menu window
C3/000E:    E220        SEP #$20
C3/0010:    C210        REP #$10
C3/0012:    20640B      JSR $0B64
C3/0015:    20750B      JSR $0B75
C3/0018:    C220        REP #$20
C3/001A:    A90001      LDA #$0100

示例输出:

Display menu window
SEP #$20
REP #$10
JSR $0B64
JSR $0B75
REP #$20
LDA #$0100

答案 1 :(得分:2)

使用正则表达式替换将以单行解决您的问题:

sed -i -- 's/C0\/.....................//g' <your_file_name>

当然,假设你有sed。我在linux中做了这个,并且test.txt的内容被替换为你需要的。

您可以在此网站上试用sed的Windows版本:

http://gnuwin32.sourceforge.net/packages/sed.htm

答案 2 :(得分:2)

下面的批处理文件是一种可能比其他类似方法运行得更快的不同方法,但这在很大程度上取决于文件的大小:

@echo off

for /F "tokens=1-2*" %%a in ('findstr /N "^" test.txt') do (
   for /F "tokens=1,2 delims=:/" %%d in ("%%a") do (
      if "%%e" equ "C3" (
         echo %%c
      ) else if "%%e" neq "" (
         echo ; %%e %%b %%c
      ) else (
         echo/
      )
   )
)

但是,最快的方法是通过Batch-JScript混合脚本。使用.bat扩展名保存下面的文件:

@set @Batch=1    /*
@cscript //nologo //E:JScript "%~F0" < test.txt
@goto :EOF & rem */

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace
   (/^C3\/.{15}|^(..)/gm,function(A){return A.length==2?"; "+A:""}));

答案 3 :(得分:1)

此批处理文件应符合您的要求。只需将其保存为 whatever.cmd ,然后使用whatever.cmd file_to_process运行它。通过重定向标准输出保存输出,如whatever.cmd file_to_process > processed_file

@echo off
set "DEL_TOKEN=C0/"
set "DEL_TOKEN_LEN=3"
set "CHARS_TO_REMOVE=18"
set "FILENAME=%~1"

SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %FILENAME%"`) do (
    set "LINE=%%a"
    SETLOCAL EnableDelayedExpansion
    set "LINE=!LINE:*:=!"
    if not "!LINE!"=="" (
        if "!LINE:~0,%DEL_TOKEN_LEN%!"=="%DEL_TOKEN%" (
            set "LINE=!LINE:~%CHARS_TO_REMOVE%!"
        ) else (
            set "LINE=; !LINE!"
        )
    )
    echo(!LINE!
    ENDLOCAL
)

线阅读器由jeb提供。

答案 4 :(得分:1)

我通常使用JREPL.BAT在Windows命令行中进行正则表达式文本修改。

JREPL.BAT是一个纯脚本(混合JScript /批处理)实用程序,可以在XP以后的任何Windows机器上本机运行。完整的文档嵌入在脚本中。

只需一行就可以解决您的问题。假设您的文件是&#34; test.in&#34;你的输出是&#34; test.out&#34;,然后:

jrepl "^C0/.{15}|^." "|; $&" /t "|" /f test.in /o test.out

如果要覆盖原始内容,请改用/o -

JREPL解决方案非常快。

如果您想要纯批次,那么您可以使用以下优化解决方案:

@echo off
setlocal enableDelayedExpansion
for /f %%N in ('find /c /v "" ^<test.txt') do set "cnt=%%N"
<test.in >test.out (
  for /l %%N in (1 1 %cnt%) do (
    set "ln="
    set /p "ln="
    if "!ln:~0,3!" == "C0/" (set "ln=!ln:~18!") else if defined ln set "ln=; !ln!"
    echo(!ln!
  )
)

如果要覆盖原件,请将以下行添加到最后:

move /y test.out test.in >nul