Java - Apache Луч: чтение файла из GCS с кодировкой "UCS2-LE BOM" - PullRequest
0 голосов
/ 05 марта 2020

Я хочу прочитать файл в спецификации UCS2-LE, используя TextIO, но, похоже, он не работает. Есть ли способ использовать TextIO с этой кодировкой? Или есть другая библиотека, которая хорошо работает с этим типом кодировки?

Мой код находится в JAVA (Apache Beam)

PCollection<KV<String, String>> csvElements =
            pipeline.apply("Reads the input csv file", TextIO
                    .read()
                    .from(options.getPolledFile()))
                    .apply("Read File", ParDo.of(new DoFn<String, KV<String,String>>(){
                        @ProcessElement
                        public void processElement(ProcessContext c) throws UnsupportedEncodingException {
                            String element = c.element();

                            String elStr = new String(element.getBytes(),"UTF-16LE");
                            c.output(elStr);}}));

1 Ответ

0 голосов
/ 11 марта 2020

Я нашел решение в средней статье: Решение

Файл, который я читаю, хранится в GCS, отсюда и добавленные строки в части try (по сравнению с исходным кодом. )

file = "path to gas file";    
PCollection<String> readCollection = pipeline.apply(FileIO.match().filepattern(file))
                    .apply(FileIO.readMatches())
                    .apply(FlatMapElements
                            .into(strings())
                            .via((FileIO.ReadableFile f) -> {
                                List<String> result = new ArrayList<>();
                                try {
                                    ReadableByteChannel byteChannelParse = f.open();
                                    InputStream inputStream = Channels.newInputStream(byteChannelParse);
                                    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-16"));
                                    String line = br.readLine();
                                    while (line != null) {
                                        result.add(line);
                                        line = br.readLine();
                                    }
                                    br.close();
                                    inputStream.close();
                                }

                                catch (IOException e) {
                                    throw new RuntimeException("Error while reading", e);
                                }
                                return result;
                            }));

PS: я не добавил строку с учетными данными, потому что передал ее в параметры IntelliJ.

...