【问题标题】:Storing data from text into variables将文本中的数据存储到变量中
【发布时间】:2011-05-04 10:32:46
【问题描述】:

我正在尝试从文本文件中读取数据并将各种数据类型存储到变量中。 假设txt文件格式如下;

1000 1
b 2000 2
c 3000 3

现在,我正在尝试将字符存储到单独的变量中,将整数存储到单独的变量中。

到目前为止,我的尝试涉及我将文本文件读入字符串,然后使用字符串标记器将每个元素存储到数组列表中。我对如何执行此操作有一个大致的了解;检查列表中的元素是否是字符,如果是,则将其存储到字符变量中,否则如果它是整数,则将其存储到 int 中。 但是,我不熟悉识别某事物是字符串还是整数的方法,例如 isString、isInteger 等。有人能给我一些建议吗?

我的代码如下:

public class copyToString {


    public static void main(String[] args) {

        String fileSpecified = args[0];

        fileSpecified = fileSpecified.concat(".txt");
        char [] content = new char[1024];

        System.out.println ("file Specified = " + fileSpecified);

        String container;
        ArrayList <String> words = new ArrayList<String> ();


        try {
            FileReader fr = new FileReader (fileSpecified);
            BufferedReader br = new BufferedReader (fr);
            StringBuilder builder = new StringBuilder();

            int read = 0;
            while ((read = br.read(content, 0, content.length)) > 0) {
                builder.append(content, 0, read);
            }

            container = builder.toString();

            StringTokenizer tokenizer = new StringTokenizer (container);
            while (tokenizer.hasMoreTokens()) {
                words.add(tokenizer.nextToken());
            }
            fr.close();
        } catch (IOException e) {
            System.out.println (e.getMessage());
        }

        for (int i = 0; i < words.size(); i++) {
            System.out.println ("words = " + words.get(i));


        }



    }



}

谢谢

【问题讨论】:

  • 你可以使用 Scanner - 它真的比 StringTokenizer 更简单。有一点不清楚。您是说输入文件格式是已知的并给出示例,那么为什么要以编程方式识别变量类型?
  • 感谢 Lukasz,扫描仪实际上更简单,它也可以节省我的时间。我给出的输入文件格式只是我们为一项任务提供的众多示例中的一个。我必须分别考虑字符和整数,因为我将以不同的方式处理它们。这个答案是你预期的吗?

标签: java text-files


【解决方案1】:

我会非常推荐这里的 Apache Commons Lib。因为这个库有一个

  • StringUtils 类,具有用于检查字符串内容的大型方法库
  • IOUtils 类用于轻松读取文件

此外,我会使用简单的正则表达式组来识别您的文本部分。

详见 Pattern 和 Matcher 类。 (单词的正则表达式:“\w”数字“\d”)

【讨论】:

    【解决方案2】:

    如果您真的不知道每种类型可能是什么,则必须将每个字段存储为字符串,因为像 1000 这样的数字可以是短整型、整型、长整型、浮点型、双精度型或字符串。 1 是数字、字符串还是字符“1”?如果没有上下文,您将无法知道每种类型是什么。 abc 可以是十六进制数字。 ;)


    比起重新编写代码,我会花更长的时间说出我会做的不同的事情。 ;)

    public class CopyToString {
        static class Line {
            String word;
            int num1, num2;
    
            Line(String word, int num1, int num2) {
                this.word = word;
                this.num1 = num1;
                this.num2 = num2;
            }
    
            @Override
            public String toString() {
                return "Line{" + "word='" + word + '\'' + ", num1=" + num1 + ", num2=" + num2 + '}';
            }
        }
    
        public static void main(String... args) throws IOException {
            String fileSpecified = args[0] + ".txt";
            System.out.println("file Specified = " + fileSpecified);
            BufferedReader br = new BufferedReader(new FileReader(fileSpecified));
    
            List<Line> lines = new ArrayList<Line>();
            for (String line; (line = br.readLine()) != null;) {
                Scanner scanner = new Scanner(line);
                lines.add(new Line(scanner.next(), scanner.nextInt(), scanner.nextInt()));
            }
            br.close();
    
            for (Line l : lines)
                System.out.println(l);
        }
    }
    

    打印

    file Specified = text.txt
    Line{word='a', num1=1000, num2=1}
    Line{word='b', num1=2000, num2=2}
    Line{word='c', num1=3000, num2=3}
    

    【讨论】:

    • 谢谢。如果说txt文件包含未知长度的数据(考虑到txt文件中的数据量会有所不同),我们将不得不声明相当多的变量。现在,为了避免这样做,是否可以声明一个中等大小的 char 数组,然后将字符存储在其中和一个 int 数组并做同样的事情?
    • 如果您可以假设您只有 char 或 int,您可以使用普通的 int[](因为 char 适合 int)在这种情况下,我会使用 split 和 parseInt。你将如何分辨数字 1 和字符 '1' 之间的区别
    • 我们提供的 txt 文件将始终采用我展示的相同格式。在这种情况下,每一行都有一个字母(char)开头,然后有一个 int(例如:1000)和一个 unsigned int(例如:1)。在那种情况下,我真的需要担心区分数字 1 和字符“1”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多