`

删除citeulike导出的bib文件中的中文字符,使之能在WinEdt中读取

阅读更多
在使用Citeulikehttp://citeulike.org/导出bib文件时,发现导出的文件在WinEdt中无法被识别。。。也就是\cite{}后不弹出提示
后来发现是有中文文献的缘故。。。。干脆写了个小程序去除中文字符。
顺带去除citeulike开头的行。


程序功能:
  • 删除当前文件夹下的bib文件中以"citeulike" 开头(不含空格)的行
  • 非ASCII字符的行。
  • 原文件名称加.origin
  • 生成的文件与原文件同名

编译好的Jar文件见附件

package lc.bibtex;

import java.io.*;

import javax.swing.JOptionPane;

public class DealWithCiteulikeBibFile {
	//删除当前文件夹下的bib文件中以"citeulike" 开头(不含空格)的行,以及非ASCII字符的行。
	//原文件名称加.origin;生成的文件与原文件同名
	public static void main(String[] args) throws IOException {

		//找到.bib文件
		File[] bibFiles = new File(".").listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				return pathname.isFile() && pathname.getName().endsWith(".bib");
			}
		});

		String[] toDelete = { "citeulike" };//删除以 "citeulike" 开头的行
		boolean deleteNotASCII = true;//删除含非ASCII字符的行,否则ctex读取错误。。。。
		boolean deleteOriginFileIfNoChange = true;//如果生成的文件与原文件相同,则删除原文件
		for (File f : bibFiles) {
			File bak = new File(f.getCanonicalPath() + ".origin");
			if (bak.exists())
				bak.delete();
			boolean b = f.renameTo(bak);//现在备份文件为原文件了!!

			if (!b) {
				JOptionPane.showMessageDialog(null, "文件 " + f.getName()
						+ " 或文件 " + bak.getName() + "可能正被其他程序访问!");
				continue;
			}
			deleteLinesNotASCII_or_StartWith(bak, f, toDelete, deleteNotASCII,
					deleteOriginFileIfNoChange);
		}

	}

	/**
	 * 删除除空格外以toDelete中字符串开头的单词(可选),以及含有非ASCII字符的行(可选)
	 * 
	 * @param originFile
	 *            原文件
	 * @param newFileName
	 *            输出文件
	 * @param toDelete
	 *            删除除空格外以toDelete中字符串开头的单词,toDelete可为null,视为不选该项
	 * @param deleteNotASCII
	 *            是否删除含非ASCII字符的行
	 * @param deleteOriginFileIfNoChange
	 *            当新文件和原文件相同时,是否删除原文件
	 * @throws IOException
	 */
	public static void deleteLinesNotASCII_or_StartWith(File originFile,
			File newFile, String[] toDelete, boolean deleteNotASCII,
			boolean deleteOriginFileIfNoChange) throws IOException {
		BufferedReader bf = new BufferedReader(new FileReader(originFile));
		PrintWriter writer = new PrintWriter(newFile);
		boolean hasChanged = false;
		loop: while (bf.ready()) {
			String line = bf.readLine();
			String lineTrim = line.trim();

			if (toDelete != null)
				for (int i = 0; i < toDelete.length; i++) {//删除除空格外以toDelete中字符串开头的单词
					if (lineTrim.startsWith(toDelete[i])) {
						hasChanged = true;
						continue loop;
					}
				}
			for (int i = 0; i < lineTrim.length(); i++) {//删除该行中含有非ASCII字符的行
				if (lineTrim.charAt(i) > 127) {
					hasChanged = true;
					continue loop;
				}
			}
			writer.println(line);
		}
		bf.close();
		writer.close();
		if (!hasChanged && deleteOriginFileIfNoChange)
			originFile.delete();
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics