在使用Citeulike导出bib文件时,发现导出的文件在WinEdt中无法被识别。。。也就是\cite{}后不弹出提示 后来发现是有中文文献的缘故。。。。干脆写了个小程序去除中文字符。 顺带去除citeulike开头的行。 程序功能:
- 删除当前文件夹下的bib文件中以"citeulike" 开头(不含空格)的行
- 非ASCII字符的行。
- 原文件名称加.origin
- 生成的文件与原文件同名
- 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();
- }
- }