`
joyocaowei
  • 浏览: 32792 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

文件内容替换与比较

 
阅读更多

现在又一个这样的需求, 一个形如这样的文件:

test.txt 写道
/* ----------------- name1 ----------------- */

flag1: name1 type: b
description: "hello"
condition: a(name2)

/* ----------------- name2 ----------------- */

flag2: name2 type: c
box_name: name3
description: "world"
condition: b(name3)

/* ----------------- name3 ----------------- */

flag1: name3 type: b
description: "hello world"

 

 现在要求将里面的name进行替换,比如将name1换成newname1,name2换成newname2,替换的内容可以用properties文件,例如properties文件的内容可以如下所示:

properties文件 写道
name1=newname1
name2=newname2
name3=newname3
 

与形如out.txt文件的内容比较,结果是这两个文件的逻辑内容一致, 还要验证test2的文件编写规则是否正确,对于某些name块中有condition属性,里面的name要定义在此name之上

test2.txt 写道
/* ----------------- newname3 ----------------- */

flag1: newname3 type: c
description: "world"

/* ----------------- newname2 ----------------- */

flag2: newname2 type: b
box_name: newname3
description: "hello world"
condition: b(newname3)

/* ----------------- newname1 ----------------- */

flag1: newname1 type: b
description: "hello"
condition:a(newname2)
 

  给出我的实现方法,实现的方法比较粗糙(因为注释的话是不影响的,所以我都是将注释去掉之后在比较的),我先创建一个类,把文件的内容进行抽象。

import java.util.*;

public class JobDefine {
	private int flag;
	private String name;
	private String boxname;
	private List<String> conditionList;
	private Map<String, String> map;

	public List<String> getConditionList() {
		return conditionList;
	}

	public void setConditionList(List<String> conditionList) {
		this.conditionList = conditionList;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getBoxname() {
		return boxname;
	}

	public void setBoxname(String boxname) {
		this.boxname = boxname;
	}

	public Map<String, String> getMap() {
		return map;
	}

	public void setMap(Map<String, String> map) {
		this.map = map;
	}

	public int getFlag() {
		return flag;
	}

	public void setFlag(int flag) {
		this.flag = flag;
	}

	@Override
	public int hashCode() {
		// 这里没有编写
		return super.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}
		if (!(obj instanceof JobDefine)) {
			return false;
		}
		JobDefine define = (JobDefine) obj;
		Map<String, String> map1 = define.getMap();
		Set<String> keyset = map1.keySet();
		int i = 0;
		if (define.getName().equals(name) && map1.size() == map.size()) {
			for (String s : keyset) {
				if (map.containsKey(s) && map.get(s).equals(map1.get(s))) {
					i++;
				} else {
					return false;
				}
			}
		}
		return (map1.size() == i);
	}
}

 之后编写比较以及验证方法:

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SequenceDef {
	public static void main(String[] args) throws IOException {
		replacedFile();
		compareFiles();
		verifyFile();
	}

	private static void replacedFile() throws IOException {
		String fileContext = readFile("test.txt");
		System.out.println("********************************");

		Properties prop = new Properties();
		InputStream in = SequenceDef.class.getClassLoader()
				.getResourceAsStream("map2.properties");
		prop.load(in);
		in.close();
		Set<Object> keyValue = prop.keySet();
		for (Object o : keyValue) {
			String key = (String) o;
			System.out.println(key);
			System.out.println(prop.getProperty(key));
			fileContext = fileContext.replaceAll(key, prop.getProperty(key));
		}
		System.out.println("********************************");
		writeFile("out.txt", fileContext);
	}

	/**
	 * 将文件读取成字符串
	 * 
	 * @param sourceFile
	 * @return
	 */
	private static String readFile(String sourceFile) {
		StringBuilder sb = new StringBuilder();
		BufferedReader br;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(
					sourceFile)));
			char[] buf = new char[64];
			int count = 0;
			try {
				while ((count = br.read(buf)) != -1) {
					sb.append(buf, 0, count);
				}
			} finally {
				if (br != null) {
					br.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		String fileContext = sb.toString();
		return fileContext;
	}

	private static void writeFile(String toFileName, String fileContext) {
		PrintWriter out = null;
		try {
			out = new PrintWriter(
					new BufferedWriter(new FileWriter(toFileName)));
			out.print(fileContext);

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (out != null) {
				out.flush();
				out.close();
			}
		}
	}

	/**
	 * 首先根据注释/*加上*'/'来划分字符串,每一个字符串当做一个jobclass来处理,并处理字符串放进类的相应属性中
	 * 
	 * @param sourceFile
	 * @return
	 */
	private static List<JobDefine> splitContent(String sourceFile) {
		String fileContent = readFile(sourceFile);
		String[] str = fileContent.split("\\/*(.*)\\*/");
		List<JobDefine> list = new ArrayList<JobDefine>();
		for (int i = 1; i < str.length; i++) {
			String splittext = str[i].trim();
			JobDefine perjob = new JobDefine();
			perjob.setFlag(i);
			Map<String, String> map = new HashMap<String, String>();
			String[] allline = splittext.split("\r\n");
			// You can add condition here.
			String[] names = { "flag1", "flag2" };
			for (int index = 0; index < allline.length; index++) {
				String line = allline[index];
				if (index == 0) {
					for (String prefixjob : names) {
						if (line.startsWith(prefixjob)) {
							int end = line.indexOf("job_type") - 1;
							int from = line.indexOf(":") + 2;
							String name = line.substring(from, end);
							perjob.setName(name);
							map.put(prefixjob, name);
							// s.replaceAll("\\s*$", "") means 去掉s末尾处的空格
							map.put("job_type",
									line.substring(line.lastIndexOf(":") + 2)
											.replaceAll("\\s*$", ""));
							break;
						}
					}
				} else {
					if (line.startsWith("box_name")) {
						String boxname = line.substring(line.indexOf(":") + 2)
								.trim();
						perjob.setBoxname(boxname);
						map.put("box_name", boxname);
					} else if (line.startsWith("condition")) {
						List<String> conditionList = new ArrayList<String>();
						String condition = line
								.substring(line.indexOf(":") + 2).replaceAll(
										"\\s*$", "");
						map.put("condition", condition);
						// 将一个字符串中的圆括号的内容放入list中
						Matcher m = Pattern.compile("\\(.+?\\)").matcher(
								condition);
						while (m.find()) {
							conditionList.add(m.group().substring(1,
									m.group().length() - 1));
						}
						perjob.setConditionList(conditionList);
					} else if (line.startsWith("#")) {
						String owner = line.substring(line.indexOf(":") + 1)
								.replaceAll("\\s*$", "");
						map.put("owner", owner);
					} else {
						map.put(line.substring(0, line.indexOf(":")),
								line.substring(line.indexOf(":") + 1));
					}
				}
			}
			perjob.setMap(map);
			list.add(perjob);
		}
		return list;
	}

	/**
	 * 比较两个文件的逻辑内容是否一致,分成一个一个job来比较 当他们的name一致时,比较有相同name的job
	 * 
	 */
	private static void compareFiles() {
		List<JobDefine> autoList = splitContent("out.txt");
		List<JobDefine> writeList = splitContent("test2.txt");
		int i = 0;
		for (JobDefine define1 : autoList) {
			for (JobDefine define2 : writeList) {
				if (define1.getName().equals(define2.getName())) {
					if (!define1.equals(define2)) {
						System.out.println("the content for the name ["
								+ define1.getName() + "] is not equal.");
					} else {
						i++;
					}
					break;
				}
			}
		}
		if (autoList.size() == i) {
			System.out.println("the two files content are consistent.");
		}
	}

	/**
	 * 如果boxname和condition有值,并且在nameMap中的,那么放入conditionMap中
	 * 在conditionMap中,如果某个name匹配的value值比他的jobname的value大。说明这个conditionMap中的
	 * jobclass定义与jobname之后,这样是不对的。
	 */
	private static void verifyFile() {
		List<JobDefine> list = splitContent("test2.txt");
		Map<String, Integer> nameMap = new HashMap<String, Integer>();
		int i = 0;
		for (JobDefine perclass : list) {
			i++;
			nameMap.put(perclass.getName(), i);
		}
		int j = 0;
		int tag = 0;
		for (JobDefine perclass : list) {
			j++;
			String boxname = perclass.getBoxname();
			List<String> conditionList = perclass.getConditionList();

			if (null != boxname || null != conditionList) {
				Map<String, Integer> conditionMap = new HashMap<String, Integer>();
				if (null != boxname && nameMap.containsKey(boxname)) {
					conditionMap.put(boxname, nameMap.get(boxname));
				}
				if (null != conditionList) {
					for (String percondition : conditionList) {
						if (nameMap.containsKey(percondition)) {
							conditionMap.put(percondition,
									nameMap.get(percondition));
						}
					}

				}
				if (null != conditionMap) {
					Set<Map.Entry<String, Integer>> set = conditionMap
							.entrySet();
					for (Map.Entry<String, Integer> entry : set) {
						if (entry.getValue().intValue() > j) {
							tag++;
							System.out.println("This job name [ "
									+ perclass.getName()
									+ " ] definition location is not correct."
									+ " It should list after name [ "
									+ entry.getKey() + " ]");
						}
					}

					// for (Integer integer : conditionMap.values()) {
					// if (integer.intValue() > j) {
					// tag++;
					// System.out.println("This job name [ "
					// + perclass.getName()
					// + " ] definition location is not correct."
					// }
					// }
				}
			}
		}
		if (tag == 0) {
			System.out.println("This file's content is CORRECT.");
		} else {
			System.out.println("This file's job definition is INCORRECT.");
		}
	}
}
   

 

分享到:
评论

相关推荐

    文件内容替换工具(文件内容替换工具)

    小巧实用的文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 文件内容替换工具 ...

    文件内容替换工具

    文件内容替换工具是一种在计算机操作系统中广泛使用的实用程序,它允许用户查找并替换文本文件中的特定文字或字符串。这样的工具对于编程、文档编辑、代码修改等任务尤其有用,能够极大地提高工作效率。在本文中,...

    批量word文件内容替换工具1.0会替换目录下所有的word文件包含子目录.exe

    Word文件内容批量替换官方版是一款专业的文字批量替换工具,很多朋友在工作的时候都需要对Word文档进行编辑处理,如果想要将某个文档中的字符内容修改为其它文字,可以试试小编带来的这款Word文件内容批量替换软件,...

    文件内容替换(遍历所有文件)

    在IT领域,文件内容替换是一项常见的操作,尤其在文本处理、文档编辑或代码修改时更为常见。本知识点主要围绕“文件内容替换(遍历所有文件)”这一主题展开,涉及如何在指定文件夹及其子文件夹下批量进行字符串替换...

    批量word文件内容替换工具 v1.0 单文件版.rar

    批量Word文件内容替换工具是一款高效实用的软件,专为处理大量Word文档中的文本替换任务而设计。这款v1.0单文件版简化了操作流程,让用户可以一次性替换多个Word文档中的特定文字或短语,极大地提高了工作效率。尤其...

    文件内容替换程序v1.0绿色免费版

    文件内容替换程序是一款可以进行文件内容批量进行替换的强大工具,使用这款文件内容替换程序可以让你一键替换许多程序内容,比如文件的后缀,文件的内容等等。需要的用户可以下载使用,它所占内存很小很小。 基本...

    自主创作的一款多目录批量文件内容替换工具

    可以批量替换指定的字符串、文字、数字、英文等文本信息的工具,支持多目录同时替换,同时支持大部分文本类型...2023年5月10日 更新v1.1.0版本,修复xls、xlsx、doc、docx兼容性问题,支持这四种文件的多形式内容替换。

    XML文件,批量进行替换文本内容

    此文件支持以下功能: 1、可以批量同时处理多个XML文件,适合需要批量修改XML文件中部分内容的...PS:本工具是一个可扩展的工具,主要功能还是批量处理替换文件中的内容,主要用于某些程序,需要额外操作修改配置文件。

    批量文本文件内容替换工具

    (此软件已有更新 请下载(批量文本文件内容替换工具(第3版))

    文件内容批量替换工具

    本文将深入探讨“文件内容批量替换工具”,揭示其在提高工作效率方面的强大功能。 “文件内容批量替换工具”是一款专为处理此类问题设计的应用软件,它能够支持多种文件类型,包括但不限于htm、html、asp和java等。...

    bat脚本技巧一键批量替换修改文本文件内容,bat脚本知识小技巧小妙招

    今天分享一个一键批量替换文件内容的脚本给大家,我们通过脚本可以一键,批量修改和替换文本内容,只需要在配置文件中,设置好我们想要替换的内容,中间用空格隔开,bat脚本就会自动将我们设置的内容,一键批量替换...

    .net 文件内容替换

    必须安装 Microsoft .NET Framework 2.0 功能: 1. 支持目录批量文件替换 2. 支持单个文件替换 3. 支持子目录遍历

    文件内容批量替换软件

    在IT行业中,文件内容批量替换是一项常见的需求,特别是在文本处理、数据清洗或代码修改时。本文将详细解析“文件内容批量替换软件”的相关知识点,并探讨其在实际应用中的价值。 批量替换工具通常是一个能处理大量...

    自己制作的文件内容和文件名同时替换

    在进行文件内容替换时,如果原始文件的编码与VBS默认的编码不符,就会产生这种细微变化。例如,如果原始文件是UTF-8编码,而VBS按照ANSI编码处理,那么非ASCII字符可能会被错误地转换。 解决这个问题的方法通常有...

    批量替换文件内容

    批量替换文件内容的原理通常是通过读取每个文件,查找预设的匹配模式,然后将找到的内容替换为新的文本。这个过程可以手动进行,但效率极低,尤其是面对大量文件时。因此,出现了许多自动化工具,其中`ultrareplace`...

    为多个文本文件做内容批量替换

     当列表里的“备注”栏显示出“替换成功”,即表示已经将不同文件里的相同内容替换完成。并且在列表里还会显示替换成功的数量,一目了然(如图),很简便也很实用吧!要删除列表里的内容,直接选定欲删除的内容后,在...

    python替换文件内容

    python替换文件内容

    文件内容替换与文件编码格式转换java源码

    总之,理解文件编码和Java的I/O操作是实现文件内容替换和编码转换的关键。掌握这些技能,不仅能够帮助我们解决实际问题,还能提升我们的编程能力。在实际工作中,我们需要灵活运用这些知识,以便更好地管理和维护...

    实现文件内容替换的一段C语言源代码

    在IT领域,文件内容替换是一项常见的任务,尤其在软件开发和文本处理中。这段C语言源代码提供了一种实现这一功能的方法,它允许用户指定要查找和替换的文本内容,并且已经在不同的平台上进行了编译和测试,包括老...

    批量查找文件内容替换

    在IT行业中,批量查找文件内容并进行替换是一项常见的任务,特别是在处理大量文本数据时。这个操作可以帮助我们统一更新文档中的特定信息,优化代码库,或者调整配置文件等。以下是对这个主题的详细解释: 批量查找...

Global site tag (gtag.js) - Google Analytics