当前位置: 首页 > 知识库问答 >
问题:

读取文件并在找到分隔符时拆分其内容

凌远
2023-03-14

我的文件内容如下:

nellkb:company_dc
  rdfs:label "dC"  "WASHINGTON" , "Washington" ;
  skos:prefLabel "www.wikipedia.com" .
nellkb:politicsblog_quami_ekta
  rdfs:label "Quami Ekta" ;
  skos:prefLabel "Quami Ekta" .
nellkb:female_ramendra_kumar
  rdfs:label "Ramendra Kumar" ;
  skos:prefLabel "Ramendra Kumar" .

我需要在分隔符“”处拆分我的文件。并将前面的内容保存在字符串中。我怎么能那么做?我尝试了以下方法,但不起作用

try {
    String sCurrentLine = null;
    int i = 0;
    br = new BufferedReader(new FileReader(rdfInstanceFile));
    while ((sCurrentLine = br.readLine()) != null) {
        splitted = sCurrentLine.split(".");
    }
} catch (IOException e) {
    e.printStackTrace();
}

共有1个答案

宁卓
2023-03-14

使用scanner类。这个场景非常适合它。您所需要做的就是指定'\\.'分隔符。

没有必要构建一个字符串然后拆分它...

import java.io.InputStream;
import java.util.Scanner;

public class ScanFile {
    public static void main(String[] args) {
        try {
            InputStream is = ScanFile.class.getClassLoader().getResourceAsStream("resources/foo.txt");
            Scanner scan = new Scanner(is);
            scan.useDelimiter("\\.[\r\n]+"); // Tokenize at dots (.) followed by CR/LF.
            
            int i = 1;
            while (scan.hasNext()) {
                String line = scan.next().trim();
                
                System.out.printf("Line #%d%n-------%n%n%s%n%n", i++, line);
            }
            
            scan.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Line #1
-------

nellkb:company_dc
  rdfs:label "dC"  "WASHINGTON" , "Washington" ;
  skos:prefLabel "WASHINGTON"

Line #2
-------

nellkb:politicsblog_quami_ekta
  rdfs:label "Quami Ekta" ;
  skos:prefLabel "Quami Ekta"

Line #3
-------

nellkb:female_ramendra_kumar
  rdfs:label "Ramendra Kumar" ;
  skos:prefLabel "Ramendra Kumar"

公共扫描程序useDelimiter(字符串模式)

扫描程序构造函数接受六(6)种不同类型的对象:文件InputStream路径可读ReadableByteChannelString

// Constructs a new Scanner that produces values scanned from the specified file.
Scanner(File source)
// Constructs a new Scanner that produces values scanned from the specified file.
Scanner(File source, String charsetName)
// Constructs a new Scanner that produces values scanned from the specified input stream.
Scanner(InputStream source)
// Constructs a new Scanner that produces values scanned from the specified input stream.
Scanner(InputStream source, String charsetName)
// Constructs a new Scanner that produces values scanned from the specified file.
Scanner(Path source)
// Constructs a new Scanner that produces values scanned from the specified file.
Scanner(Path source, String charsetName)
// Constructs a new Scanner that produces values scanned from the specified source.
Scanner(Readable source)
// Constructs a new Scanner that produces values scanned from the specified channel.
Scanner(ReadableByteChannel source)
// Constructs a new Scanner that produces values scanned from the specified channel.
Scanner(ReadableByteChannel source, String charsetName)
// Constructs a new Scanner that produces values scanned from the specified string.
Scanner(String source)
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ScanFile {
    private static ClassLoader loader = ScanFile.class.getClassLoader();
    
    private static interface LineProcessor {
        void process(String line);
    }

    private static interface Reader<T> {
        T read(String resource, String delimiter) throws IOException;
        void flush();
    }

    private abstract static class FileScanner<T> implements Reader<T> {
        private LineProcessor processor;
        public void setProcessor(LineProcessor processor) {
            this.processor = processor;
        }

        public T read(Scanner scan, String delimiter, boolean close) throws IOException {
            scan.useDelimiter(delimiter);
            while (scan.hasNext()) {
                processor.process(scan.next().trim());
            }
            if (close) {
                scan.close();
            }
            return null;
        }

        public T read(InputStream is, String delimiter, boolean close) throws IOException {
            T t = read(new Scanner(is), delimiter, true);
            if (close) {
                is.close();
            }
            return t;
        }

        public T read(String resource, String delimiter) throws IOException {
            return read(loader.getResourceAsStream("resources/" + resource), delimiter, true);
        }
    }
    
    public static class FileTokenizer extends FileScanner<List<String>> {
        private List<String> tokens;
        public List<String> getTokens() {
            return tokens;
        }
        public FileTokenizer() {
            super();
            tokens = new ArrayList<String>();
            setProcessor(new LineProcessor() {
                @Override
                public void process(String token) {
                    tokens.add(token);
                }
            });
        }
        public List<String> read(Scanner scan, String delimiter, boolean close) throws IOException {
            super.read(scan, delimiter, close);
            return tokens;
        }
        @Override
        public void flush() {
            tokens.clear();
        }
    }
    
    public static void main(String[] args) {
        try {
            FileTokenizer scanner = new FileTokenizer();
            List<String> items = scanner.read("foo.txt", "\\.[\r\n]+");

            for (int i = 0; i < items.size(); i++) {
                System.out.printf("Line #%d%n-------%n%n%s%n%n", i + 1, items.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 类似资料:
  • 问题内容: 我有一个CSV文件,其格式如下: “ FieldName1”,“ FieldName2”,“ FieldName3”,“ FieldName4” “ 04/13/2010 14:45:07.008”,“ 7.59484916392”,“ 10”,“ 6.552373” “ 04/13/2010 14:45:22.010 ”,“ 6.55478493312”,“ 9”,“ 3.53785

  • 问题内容: 我已经解决了这些问题,但似乎仍然无法解决。我有一个文本文件,分为几行。每行包含5个数据,中间用“,”分隔。我正在尝试读取此文件并将信息拆分为以下形式的字符串数组: 请有人可以帮我解决一个简单的解决方案!?谢谢!!!:) 数据示例: 样例代码: 公共无效的readFile(){ 错误 07-24 06:26:56.524:E / AndroidRuntime(27203):致命例外:主要

  • 问题内容: 我有一个文件,我想用Java读取并将其拆分为(用户输入)输出文件。这是我读取文件的方式: 如何将文件拆分为文件? 注意-由于文件中的条目数约为100k,因此我无法将文件内容存储到数组中,然后将其拆分并保存到多个文件中。 问题答案: 由于一个文件可能很大,因此每个拆分文件也可能很大。 例: 源文件大小:5GB 数字分割:5:目的地 档案大小:每个1GB(5个档案) 即使我们有这样的内存,

  • 我想在拆分函数调用中使用空格作为分隔符,但我想在单个单元格数组中输入某些单词;例如。 例如: 在带有一些分隔符的函数拆分调用之后,输出应如下所示: 我需要找到一个分隔符(或正则表达式模式)用于split函数。我如何着手做那件事?

  • 问题内容: 我有一个txt文件,格式为: 我想将所有键及其值放入创建的hashMap中。如何获得或知道何时在冒号(:)处拆分键和值?:-) 我试过了: 问题答案: 使用逐行读取文件,并针对该行中第一次出现的行执行一次(如果没有,则忽略该行)。 这是一些示例代码-避免使用Scanner(它有一些微妙的行为,恕我直言,实际上比其价值更大的麻烦)。

  • 问题内容: 我正在尝试读取以下形式的大文本文件: 我想在文本文件中将此字符串作为一个大的Java字符串读取。这可能吗?我知道使用split方法。 它可以逐行读取它,但我真正需要的是在“ +”号处分割此长文本字符串。之后,我想将其存储为数组,arraylist,列表,… 谁能帮我这个?因为互联网上的所有信息都只是逐行读取文件。提前致谢! 问题答案: 您可以使用或任何IO类读取文件。假设文件中包含该字