7

CSVコンマ区切りのスプレッドシートファイルにすばやくアクセスする必要があるプログラムに取り組んでいます。これまでのところ、BufferedReaderを使用して簡単に読み取ることができました。ただし、読み取ったデータを編集してから、CSVにエクスポートして戻すことができるようにしたいと思います。

スプレッドシートには、名前、電話番号、電子メールアドレスなどが含まれています。プログラムには全員のデータが一覧表示され、それらをクリックすると、CSVから取得した詳細情報を含むページが表示されます。そのページでデータを編集できます。[変更を保存]ボタンをクリックして、データをCSVの適切な行にエクスポートするか、古いデータを削除して新しいデータを追加できるようにします。

BufferedWriterの使用、または使用する必要のあるものは何でも使用することにあまり慣れていません。

私が始めたのは、FileIOというカスタムクラスを作成することです。これには、BufferedReaderとBufferedWriterの両方が含まれています。これまでのところ、read()と呼ばれるbufferedReader.readLine()を返すメソッドがあります。ここで、write(String line)という関数が必要です。

public static class FileIO {
    BufferedReader read;
    BufferedWriter write;

    public FileIO (String file) throws MalformedURLException, IOException {
        read = new BufferedReader(new InputStreamReader (getUrl(file).openStream()));
        write = new BufferedWriter (new FileWriter (file));
    }

    public static URL getUrl (String file) throws IOException {
        return //new URL (fileServer + file).openStream()));
                FileIO.class.getResource(file);
    }

    public String read () throws IOException {
        return read.readLine();
    }

    public void write (String line) {
        String [] data = line.split("\\|");
        String firstName = data[0];

        // int lineNum = findLineThatStartsWith(firstName);
        // write.writeLine(lineNum, line);
    }
};

私は誰かが私がこれをどのように行うことができるかについての考えを持っていることを望んでいますか?

4

5 に答える 5

18

車輪の再発明ではなく、CSVファイルの読み取りと書き込みをサポートするOpenCSVを見ることができます。読み書きの例は次のとおりです

于 2013-01-09T01:23:11.213 に答える
2

Apachecommonscsvを検討してください。APIをすばやく理解するには、次の4つの重要なクラスがあります。

CSVFormat

CSVファイルの形式を指定し、入力を解析します。

CSVParser

指定された形式に従ってCSVファイルを解析します。

CSVPrinter

値をCSV形式で印刷します。

CSVRecord

CSVファイルから解析されたCSVレコード。

コード例: ここに画像の説明を入力してください

ユニットテストコード: ここに画像の説明を入力してください

于 2017-02-13T07:42:41.100 に答える
1

スプレッドシートには、名前、電話番号、電子メールアドレスなどが含まれています。プログラムには全員のデータが一覧表示され、それらをクリックすると、CSVから取得した詳細情報を含むページが表示されます。そのページでデータを編集できます。[変更を保存]ボタンをクリックして、データをCSVの適切な行にエクスポートするか、古いデータを削除して新しいデータを追加できるようにします。

ファイルの内容は一連のバイトです。CSVはテキストベースのファイル形式です。つまり、バイトのシーケンスは文字のシーケンスとして解釈され、改行は特殊な改行文字で区切られます。

したがって、行の長さが長くなる場合は、新しい文字用のスペースを確保するために、後続のすべての行の文字を移動する必要があります。同様に、行を削除するには、ギャップを埋めるために後の文字を移動する必要があります。つまり、ファイル内の後続のすべての行を書き直さずに、csvの行を更新することはできません(少なくともその長さを変更する場合はそうではありません)。簡単にするために、ファイル全体を書き直します。

CSVファイルを読み書きするためのコードがすでにあるので、それを適応させるのは簡単なはずです。しかし、それを行う前に、その仕事に適したツールを使用しているかどうかを自問する価値があるかもしれません。レコードのリストを保持し、フォーム内の個々のレコードを編集することが目標である場合は、MicrosoftAccessや同等のOpenOfficeと呼ばれるプログラムなどのプログラムの方が自然に適している可能性があります。UIがこれらのプログラムが提供するものを超える必要がある場合は、リレーショナルデータベースを使用してデータを保持する方がおそらく適しています(CSVよりも効率的で柔軟性があります)。

于 2013-01-09T01:37:43.453 に答える
0

依存関係を追加する

implementation 'com.opencsv:opencsv:4.6'

onCreate()に以下のコードを追加します

InputStreamReader is = null;
        try {
              String path= "storage/emulated/0/Android/media/in.bioenabletech.imageProcessing/MLkit/countries_image_crop.csv";
            
             CSVReader reader = new CSVReader(new FileReader(path));
             String[] nextLine;
             int lineNumber = 0;
             while ((nextLine = reader.readNext()) != null) {
                lineNumber++;

                //print CSV file according to your column 1 means first column, 2 means 
                  second column
                Log.e(TAG, "onCreate: "+nextLine[2] );
            }
        }
        catch (Exception e)
        {
             Log.e(TAG, "onCreate: "+e );
        }
于 2021-04-28T07:18:39.123 に答える
0

私はそれを使用して解決しました

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-csv</artifactId>
        <version>2.8.6</version>
    </dependency>

  private static final CsvMapper mapper = new CsvMapper();
  public static <T> List<T> readCsvFile(MultipartFile file, Class<T> clazz) throws IOException {
    InputStream inputStream = file.getInputStream();
    CsvSchema schema = mapper.schemaFor(clazz).withHeader().withColumnReordering(true);
    ObjectReader reader = mapper.readerFor(clazz).with(schema);
    return reader.<T>readValues(inputStream).readAll();
}
于 2022-02-22T18:10:49.353 に答える