package fr.ens.biologie.genomique.eoulsan.splitermergers; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Iterator; import java.util.Set; import fr.ens.biologie.genomique.eoulsan.EoulsanException; import fr.ens.biologie.genomique.eoulsan.core.Parameter; import fr.ens.biologie.genomique.eoulsan.data.DataFile; import fr.ens.biologie.genomique.eoulsan.data.DataFormat; import fr.ens.biologie.genomique.eoulsan.data.DataFormats; /** * This class define a splitter class for expression files. * @author Laurent Jourdren * @since 2.0 */ public class ExpressionSplitter implements Splitter { private static final int DEFAULT_SPLIT_MAX_ENTRIES = 10000; static final String EXPRESSION_FILE_HEADER = "Id\tCount\n"; private int splitMaxEntries = DEFAULT_SPLIT_MAX_ENTRIES; @Override public DataFormat getFormat() { return DataFormats.EXPRESSION_RESULTS_TSV; } @Override public void configure(final Set<Parameter> conf) throws EoulsanException { for (Parameter p : conf) { switch (p.getName()) { case "max.entries": this.splitMaxEntries = p.getIntValueGreaterOrEqualsTo(1); break; default: throw new EoulsanException("Unknown parameter for " + getFormat().getName() + " splitter: " + p.getName()); } } } @Override public void split(final DataFile inFile, final Iterator<DataFile> outFileIterator) throws IOException { final int max = this.splitMaxEntries; int readCount = 0; Writer writer = null; try (BufferedReader reader = new BufferedReader(new InputStreamReader(inFile.open()))) { String line = null; boolean first = true; while ((line = reader.readLine()) != null) { // Discard header if (first) { first = false; continue; } if (readCount % max == 0) { // Close previous writer if (writer != null) { writer.close(); } // Create new writer writer = new OutputStreamWriter(outFileIterator.next().create()); writer.write(EXPRESSION_FILE_HEADER); } writer.write(line + '\n'); readCount++; } // Close reader and writer reader.close(); if (writer != null) { writer.close(); } } } }