利用java实现对特定文档中的特定数据进行批量修改

​ 有些时候我们可能需要批量修改一些文件中所有文档的数据(例如txt文档),这个时候使用一些文本编辑器中自带的ctrl+h来进行编辑或许会很不方便,这个时候就可以用代码来解决这个问题,而且用代码解决时可以实现一些逻辑,
例如我们要修改一个这样的数据,需要将change标签后中括号里第三列中大于0的数据乘以二,小于0的数据改为0,等于0的数据不变

	change 4152
	    {
	      -2.30889 -1.42482 -0.653673
	      -2.33079 -1.48122 -0.465242
	      -2.30889 -1.42482 -0.653671
	      -1.39385 -0.589268 1.07442
	      -1.52996 -0.589268 1.05734
	      -1.47875 -1.14866 1.04295
	      -1.47875 -1.14866 1.04296
	      -1.35333 -1.16983 1.07397
	      -1.39385 -0.589268 1.07448
	    }

​ 下面是一个小demo

package demo;

import java.io.BufferedReader;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.math.BigDecimal;

public class LookFile {
	public static void main(String[] args) throws Exception {
        //可以做成从配置文件中获取修改文件的目录,后面将程序导成jar包后就可以重复使用了
		File file = new File("config");
		FileInputStream fis = new FileInputStream(file);
		InputStreamReader in = new InputStreamReader(fis,"UTF-8"); 
		BufferedReader buf=new BufferedReader(in);
		String conf=buf.readLine();
		gainFile(conf);
		System.out.println(conf+"双层子目录下的全部.txt文件修改成功");
	}
	
	//获取config所有双层目录下所有txt结尾的文件(为什么是双层子目录呢?因为我懒得改了=.=)
	public static void gainFile(String fn) throws Exception{
		File bigFile=new File(fn);
		File[] files = bigFile.listFiles();
		for (File sunfile : files) {
			File[] smallFiles = sunfile.listFiles();
			for (File smallFile : smallFiles) {
				if(smallFile.isDirectory()) {
					File[] docs = smallFile.listFiles();
					for (File doc : docs) {
						if(doc.toString().endsWith(".txt")&&doc.isFile()) {
							getTxt(doc);
                            //提示文件修改成功
							System.out.println(doc.toString()+"--修改成功");
						}
					}
				}
			}
		}
	}
	//寻找change字符串后面第一个{}
	public static void getTxt (File file) throws Exception{
		FileReader in=new FileReader(file);
		BufferedReader buf=new BufferedReader(in);
		CharArrayWriter  tempStream = new CharArrayWriter(); 
		String line=null;
		while ( (line = buf.readLine()) != null) {  
			tempStream.write(line); 
            //每次返回某行数据后加一个换行符
			tempStream.append(System.getProperty("line.separator")); 
            //判断是否是需要修改的部分
            if(line.trim().startsWith("change")) {
            	A:while((line = buf.readLine()) != null) {
            		tempStream.write(line);
            		tempStream.append(System.getProperty("line.separator")); 
                    //判断从何处开始修改
            		if(line.trim().startsWith("{")) {
            			while((line = buf.readLine()) != null) {
                            //判断何时停止修改
            				if(line.trim().startsWith("}")){
            					tempStream.write(line);
            					tempStream.append(System.getProperty("line.separator")); 
            					break A;
            				}
//		            			System.out.println(line);
            					line=count(line.trim());
		            			tempStream.write(line);
		            			tempStream.append(System.getProperty("line.separator")); 
            			}
            		}
            	}
            }
        } 
		buf.close();
		FileWriter out = new FileWriter(file);
		tempStream.writeTo(out);  
        out.close();  
	}
	//计算
	public static String count(String str) {
		String[] nums = str.split("\\s");
		Double num=null;
        //用BigDecimal来避免double丢失精度的问题
		BigDecimal bdnum = null;
		if((num=Double.valueOf(nums[2]))>0) {
			bdnum = new BigDecimal(num+"");
			bdnum = bdnum.add(bdnum);
		}else if((num=Double.valueOf(nums[2]))<0) {
			num=0.0;
			bdnum = new BigDecimal(num+"");
		}else{
			bdnum = new BigDecimal(nums[2]+"");
		}
//		根据原有数据格式返回数据
		return "          "+nums[0]+" "+nums[1]+" "+bdnum;
	}
}

​ 这样就可以用来修改我们需要修改的文件了,这里只是做一个小范例,具体使用的时候可以根据需要进行逻辑的修改和功能的添加.鉴于本人水平有限,也希望大家不吝赐教,指出代码中的不足之处,万分感谢0.0。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值