Разбивая строки, разбивая их на несколько файлов

Я делю свой файл на куски, но единственная проблема, с которой я сталкиваюсь,

у меня есть файл.srt, но при выполнении кусков он вырезает символы, то есть в первом файле.srt это выглядит как 00:26:20,230 -> . в следующем файле он продолжит следующий штамп времени 00:27:40,343.

Мне нужно проверить отметку времени, чтобы завершить, а затем следующее полное предложение субтитров тоже. то есть, если он вырезает временную метку субтитра или диалог в файле, этот тект должен быть добавлен к следующему файлу. Пожалуйста, предложите мне, как я могу достичь.

Я пытаюсь, как показано ниже,

    String FilePath = "/Users/meh/Desktop/escapeplan.srt";
        FileInputStream fin = new FileInputStream(FilePath);

        System.out.println("size: " +fin.getChannel().size());
        long abc = 0l;
        abc = (fin.getChannel().size())/3;
        System.out.println("6: " +abc);
System.out.println("abc: " +abc);
       //FilePath = args[1];
        File filename = new File(FilePath);
        long splitFileSize = 0,bytefileSize=0;
        if (filename.exists()) {
            try {
                //bytefileSize = Long.parseLong(args[2]);
                splitFileSize = abc;
                Splitme spObj = new Splitme();
                spObj.split(FilePath, (long) splitFileSize);
                spObj = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("File Not Found....");
        }

    public void split(String FilePath, long splitlen) {

            long leninfile = 0, leng = 0;
            int count = 1, data;
            try {
                File filename = new File(FilePath);
                InputStream infile = new BufferedInputStream(new FileInputStream(filename));
                data = infile.read();
                System.out.println("data");
                System.out.println(data);

                while (data != -1) {
                    filename = new File("/Users/meh/Documents/srt" + count + ".srt");
    //RandomAccessFile outfile = new RandomAccessFile(filename, "rw");

                    OutputStream outfile = new BufferedOutputStream(new FileOutputStream(filename));
                    while (data != -1 && leng < splitlen) {
                        outfile.write(data);
                        leng++;
                        data = infile.read();
                    }
                    leninfile += leng;
                    leng = 0;
                    outfile.close();
                    changeTimeStamp(filename, count);

                    count++;


                }
            } catch (Exception e) {
                e.printStackTrace();
            }
}

я пытаюсь проверить метку времени в правильном формате или нет. Затем мне нужно проверить следующую строку, чтобы быть диалогом, а затем следующую строку, чтобы быть пустой строкой. затем он может остановить чанк или добавить текст из предыдущего чанка в следующий файл чанка в начале строки. так что он может получить в правильном формате.

Я пытался проверить формат, как,

while ((strLine = br.readLine()) != null) {

                String[] atoms = strLine.split(" --> ");
                if (atoms.length == 1) {
                    out.write(strLine + "\n");

                } else {

                    String startTS = atoms[0];
                    String endTS = atoms[1];
                    System.out.print("sri atmos start" + startTS);
                    System.out.print("sri atmos end" + endTS);
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss,SSS");

                    sdf.setLenient(false);
                    try
                    {
                        sdf.parse(startTS);
                        sdf.parse(endTS);
                        System.out.println("Valid time");
                        System.out.println("File path" + srcFileNm);
}
                    catch(Exception e) {
                        System.out.println("Invalid time");
                        System.out.println("Exception start" + startTS);
                        System.out.println("Exception end" + endTS);
}
}

некоторые экраны моих выходных блоков, введите описание изображения здесь введите описание изображения здесь

Помогите мне, как я могу сделать это возможным.

1 ответ

Я думаю, что вы должны изменить подход и полностью использовать основные методы ввода / вывода. Я попытался заключить логику в небольшой класс, который производит тройку с id, msecs и списком субтитров (если я не ошибаюсь, вы можете иметь больше, чем строку). Затем я оставил остаток снаружи. Chunker - это класс, который читает тройку (класс Три) из файла, так что вы можете управлять им и записывать его где-нибудь. Это просто "быстрая и грязная" идея, которую вы можете усовершенствовать, но она должна работать.

package org.norsam.stackru;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Chunker
{

    BufferedReader r;
    int chunk = 0;
    File dir;

    public Chunker(File dir, String filename) throws IOException
    {
        File f = new File(dir, filename);
        this.dir = dir;
        this.r = new BufferedReader(new FileReader(f));
    }

    public Three readThree() throws IOException
    {
        Integer id = Integer.parseInt(r.readLine());
        String msecs = r.readLine();
        String s = null;
        List<String> srt = new ArrayList<>();
        while (!(s = r.readLine().trim()).isEmpty()) {
            srt.add(s);
        }
        return new Three(id, msecs, srt);
    }

    class Three
    {
        Integer id;
        String msecs;
        List<String> srts;

        Three(Integer id, String msecs, List<String> srts)
        {
            this.id = id;
            this.msecs = msecs;
            this.srts = srts;
        }

        Three doSomething() {
            // here you can do something with your data,
            // e.g. split msecs on "-->" and check times
            return this;
        }
        void write(BufferedWriter r) throws IOException
        {
            r.write(id);
            r.newLine();
            r.write(msecs);
            r.newLine();
            for (String s : srts) {
                r.write(s);
                r.newLine();
            }
            r.newLine();
        }
    }

    public static void main(String[] args) throws IOException
    {
        String baseDir = "/dir/where/resides/srt";
        String filename = "filename.srt";
        int elemPerChunk = 50;
        int fileNum = 0;
        File dir = new File(baseDir);
        Chunker chunker = new Chunker(dir, filename);
        boolean completed = false;
        while (!completed) {
            int srtCount = 0;
            File f = new File(baseDir, "ch." + (fileNum++) + "." + filename);
            BufferedWriter w = new BufferedWriter(new FileWriter(f));
            try {
                while (srtCount++ < elemPerChunk) {
                    chunker.readThree().doSomething().write(w);
                }
            } catch (NullPointerException e) {
                completed = true;
            }
            w.close();
        }
    }
}
Другие вопросы по тегам