Formater un fichier texte en java [Résolu]

bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 22 juil. 2013 à 14:26 - Dernière réponse :  PhilC
- 9 déc. 2017 à 03:38
bonjour à tous,
j'ai un problème qui me dérange depuis un bon bout.
je veux mettre ce fichier texte

|Num du |Intitulé compl |
|compte |et du compte |
|-------|------------- |
|101000 |Capital social |
|-------|------------- |
|123000 |Réserves facul |
| |tatives et ext |
| | raordinaires |
|-------|------------- |

partir d'un code java sous la forme suivante pour pouvoir l'importer sous excel
Num du compte   Intitulé complet  du compte
101000                Capital social
123000                Réserves facultatives et extraordinaires

voici le code en question
String b= source_file.readLine();
while(b!=null){
                                             
String a = source_file.readLine();
String c = source_file.readLine();
    if( a!=null && (a.startsWith("|0") ||
      a.startsWith("|1") ||                  
      a.startsWith("|2")|| a.startsWith("|3") ||
      a.startsWith("|4")||a.startsWith("|5")||
      a.startsWith("|6") || a.startsWith("|7")||
      a.startsWith("|8")|| a.startsWith("|9")) ){
                                             
       int_compte=a;   
       int_compte = int_compte.substring(9, 24);
      x=int_compte                              }
                                     
                                     
                                             
    while( c.startsWith("|     ")){
         dev=x+c.substring(9, 24);
         System.out.println(dev+"\r\n");
         dest_file.writeBytes(dev+"\r\n");
                      }
                                         
                }


Je n’arrive toujours pas à transformer ce texte.
J'ai besoin de l'aide s'il vous plait.
Merci d'avance..
Afficher la suite 

11 réponses

Répondre au sujet
labandus 25 Messages postés jeudi 14 décembre 2000Date d'inscription 25 juillet 2013 Dernière intervention - 23 juil. 2013 à 14:48
+3
Utile
1
Salut
desolé pour la reponse tardive, mais ta classe pour formater:

package crx.mxtnx.diff.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

public class FooFormatter {

private static final String	TAB							= "\t\t\t";
private static final String	fileSourceLocation		= "C:/.../fichier_source.txt";
private static final String	fileDestinationLocation	= "C:/.../fichier_destination.txt";

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
FooFormatter fooFormatter = new FooFormatter();
fooFormatter.formatFromFileToFile(fileSourceLocation, fileDestinationLocation);
}

public void formatFromFileToFile(String fileSrcLocation, String fileDestlocation) {
List<List<String>> lineColumnsContents = formatFileContent(fileSrcLocation);
try {

BufferedWriter writer = new BufferedWriter(new FileWriter(fileDestlocation));
writeToFileDestination(writer, lineColumnsContents);
writer.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void testExtractFile() {

}

private void writeToFileDestination(BufferedWriter writer, List<List<String>> lineColumnsContents)
throws IOException {

for (List<String> line : lineColumnsContents) {
for (String column : line)
writer.write(column + TAB);
writer.newLine();
}

}

public List<List<String>> formatFileContent(String filePath) {

// columnDelimiter: storing the index of all content delimiter ( | )
Vector<Integer> columnDelimiter = new Vector<Integer>();
// contentMatrix
List<List<String>> contentMatrix = new ArrayList<List<String>>();

// final formated content
List<List<String>> lineContents = new ArrayList<List<String>>();

BufferedReader reader = null;
try {

// read the source file
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileSourceLocation)));

String line = null;
boolean endOfRowReached = false;
int columnCount = 0;

// for each line in source file
while ((line = reader.readLine()) != null) {

// check if the end of each row has been reached
if (line.contains("---")) {
endOfRowReached = true;
}
if (!endOfRowReached) {

// while the end of row has not yet been reached
int index = line.indexOf('|');
while (index >= 0) {
// harvest all delimiter position in their order
columnDelimiter.add(index);
index = line.indexOf('|', index + 1);
}

if (columnDelimiter.size() > 0) {

// harvest column content in each column limited by delimiter
columnCount = columnDelimiter.size() - 1;
List<String> rowContent = new ArrayList<String>(columnDelimiter.size() - 1);
for (int i = 0; i < columnDelimiter.size() - 1; i++) {
int j = i + 1;
String columnContent = line.substring(columnDelimiter.get(i) + 1, columnDelimiter.get(j)).trim();
rowContent.add(columnContent);
}
if (rowContent.size() > 0) {

contentMatrix.add(rowContent);
}
}
// prepare for next delimiter context
columnDelimiter.clear();
} else {

// if end of Row has been reached

List<String> tempListContent = new ArrayList<String>();
lineContents.add(tempListContent);
for (int i = 0; i < columnCount; i++) {
tempListContent.add("");

}

for (List<String> tempRow : contentMatrix) {
for (int i = 0; i < tempRow.size(); i++) {

// transform/concatenate columns into line
String tempColumn = tempListContent.get(i);
tempColumn += tempRow.get(i);
tempListContent.set(i, tempColumn);

}
}

// empty matrix table
contentMatrix.clear();
// reset toggle;
endOfRowReached = false;
}

}

} catch (FileNotFoundException e) {
e.printStackTrace();
// please handle exception well
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
// please handle exception well

}

}

return lineContents;

}
}


n'oublie de specifier ton file source et ton file destination...

les commentaires sont en anglais..
bon prog
Cette réponse vous a-t-elle aidé ?  
Merci pour ton code qui m'a beaucoup aidé. Merci.
Commenter la réponse de labandus
labandus 25 Messages postés jeudi 14 décembre 2000Date d'inscription 25 juillet 2013 Dernière intervention - 23 juil. 2013 à 19:51
+3
Utile
pas de quoi...
content d'avoir pu t'aider...
si tu as d'autres questions n'hesite pas à les poser..
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de labandus
labandus 25 Messages postés jeudi 14 décembre 2000Date d'inscription 25 juillet 2013 Dernière intervention - 25 juil. 2013 à 19:02
+1
Utile
Salut...
par rapport à la question du mercredi 24 juillet 2013 à 12:45:24
qui demandait un formattage avec resultat:

date de saisie intitulé complet du compte
16/10/2011 Capital social
16/10/2011 reserves facultatives et extraordinaires
16/10/2011 Autres emprunt a long terme aupres d'autres preteurs
611300 en EUR
16/10/2011 Capital social
16/10/2011 reserves facultatives et extraordinaires
16/10/2011 Autres emprunt a long terme aupres d'autres preteurs


voici la reponse:

ton nouveau fichier est maintenant divisé en 2 grandes parties:
- les headers faits de |++++++++|++++++++|
- et les rows faits de |--------|--------|

la fonction ci dessous traite ces 2 parties separements
sans problèmes:

	public List<List<String>> formatFileContent_2(String filePath) {

// columnDelimiter: storing the index of all content delimiter ( | )
Vector<Integer> columnDelimiter = new Vector<Integer>();
// contentMatrix
List<List<String>> contentMatrix = new ArrayList<List<String>>();

// final formated content
List<List<String>> lineContents = new ArrayList<List<String>>();
// header lines count
int headerLineCount = 0;

BufferedReader reader = null;
try {

// read the source file
reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileSourceLocation)));

String line = null;
boolean endOfRowReached = false;
int columnCount = 0;

// cursor header Start
boolean headerStartReached = false;
boolean headerEndReached = false;

// for each line in source file

// A- work on header
while ((line = reader.readLine()) != null) {

if (isHeaderDelimiterLine(line)) {
// check on the header delimiters
if (!headerStartReached) {
headerStartReached = true;
continue;
} else {
headerEndReached = true;
headerStartReached = false;
}

}

if (headerStartReached) {

// while the end of row has not yet been reached
int index = line.indexOf('|');
while (index >= 0) {
// harvest all delimiter position in their order
columnDelimiter.add(index);
index = line.indexOf('|', index + 1);
}

if (columnDelimiter.size() > 0) {

// harvest column content in each column limited by delimiter
columnCount = columnDelimiter.size() - 1;
List<String> rowContent = new ArrayList<String>(columnDelimiter.size() - 1);
for (int i = 0; i < columnDelimiter.size() - 1; i++) {
int j = i + 1;
String columnContent = line.substring(columnDelimiter.get(i) + 1, columnDelimiter.get(j)).trim();
rowContent.add(columnContent);
}
if (rowContent.size() > 0) {

contentMatrix.add(rowContent);
headerLineCount++;
}
}
// prepare for next delimiter context
columnDelimiter.clear();

}
if (headerEndReached) {

// if end of header has been reached

List<String> tempListContent = new ArrayList<String>();
lineContents.add(tempListContent);
for (int i = 0; i < columnCount; i++) {
tempListContent.add("");

}

for (List<String> tempRow : contentMatrix) {
for (int i = 0; i < tempRow.size(); i++) {

// transform/concatenate columns into line
String tempColumn = tempListContent.get(i);
tempColumn += tempRow.get(i);
tempListContent.set(i, tempColumn);

}
}

// exit loop
break;
}
}

// B- work on row content
while ((line = reader.readLine()) != null) {

if (isRowDelimiterLine(line)) {
// check if the end of each row has been reached
endOfRowReached = true;
}

if (!endOfRowReached) {
// while the end of row has not yet been reached
int index = line.indexOf('|');
while (index >= 0) {
// harvest all delimiter position in their order
columnDelimiter.add(index);
index = line.indexOf('|', index + 1);
}

if (columnDelimiter.size() > 0) {

// harvest column content in each column limited by delimiter
columnCount = columnDelimiter.size() - 1;
List<String> rowContent = new ArrayList<String>(columnDelimiter.size() - 1);
for (int i = 0; i < columnDelimiter.size() - 1; i++) {
int j = i + 1;
String columnContent = line.substring(columnDelimiter.get(i) + 1, columnDelimiter.get(j)).trim();
rowContent.add(columnContent);
}
if (rowContent.size() > 0) {

contentMatrix.add(rowContent);
}
}
// prepare for next delimiter context
columnDelimiter.clear();
} else {
// if end of Row has been reached

List<String> newLine = null;
// start transformation of rows after the all headers
for (int j = headerLineCount; j < contentMatrix.size(); j++) {

// add a new line and initialize it with blank value

List<String> tempRow = contentMatrix.get(j);

// if pivot line is NOT empty, create new line
if (!isLineBlank(tempRow.get(PIVOT_LINE_INDEX))) {
newLine = new ArrayList<String>();
lineContents.add(newLine);
for (int i = 0; i < tempRow.size(); i++) {
newLine.add("");

}
}

for (int i = 0; i < tempRow.size(); i++) {

// transform/concatenate columns into line
String tempColumn = null;
if (isColumnContentToConcatenate(i)) {
tempColumn = newLine.get(i);
tempColumn += tempRow.get(i);
} else {
// only add non empty column values
if (!isLineBlank(tempRow.get(PIVOT_LINE_INDEX)))
tempColumn = tempRow.get(i);
else
continue;
}

newLine.set(i, tempColumn);

}
}

if (headerLineCount != 0)
headerLineCount = 0;

// empty matrix table
contentMatrix.clear();
// reset toggle;
endOfRowReached = false;

}

}
} catch (FileNotFoundException e) {
e.printStackTrace();
// please handle exception well
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null)
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
// please handle exception well

}

}

return lineContents;

}



pour l'utiliser s'il te plait remplace dans la classe
"FooFormatter" donnée deja en première reponse...
dans la fonction
main(String[] args)


la ligne

		List<List<String>> lineColumnsContents = formatFileContent(fileSrcLocation);


par la ligne

		List<List<String>> lineColumnsContents = formatFileContent_2(fileSrcLocation);


et le tour est joué..


à plus
Commenter la réponse de labandus
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 23 juil. 2013 à 07:54
0
Utile
Salut,

Pour les deux lignes de titre, je te laisse gérer ca.

Pour les lignes suivantes, ce morceau de code devrait t'aider :
	public static void main(String[] args) {
String test="|101000 |Capital social | ";
Matcher matcher = Pattern.compile("\\p{Space}*\\|\\p{Space}*([0-9]+)\\p{Space}*\\|\\p{Space}*([a-zA-Z ]+).*").matcher(test);
while (matcher.find()) {
System.out.println(matcher.group(1)+"\t"+matcher.group(2));
}
}
Commenter la réponse de cs_Julien39
bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 23 juil. 2013 à 16:03
0
Utile
merci
labandus

tu m'a vraiment aidé ton code est optimal et fonctionne a merveille
Commenter la réponse de bourgeoisvalere
bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 24 juil. 2013 à 10:19
0
Utile
bonjour
labandus

j'aimerai savoir si par contre le fichier est sous la forme suivante
|++++++++++++|++++++++++++++|
|date de     |Intitulé compl|
|saisie      |et du compte  |
|++++++++++++|++++++++++++++|
|16/10/2011  |Capital social|
|16/10/2011  |Réserves facul|
|            |tatives et ext|
|            | raordinaires |
|16/10/2011  |Autres emprunt|
|            |s a long terme|
|            |aupres d'autre|
|            |preteurs      |
|------------|--------------|
|611300 en EUR              |
|------------|------------- |
|16/10/2011  |Capital social|
|16/10/2011  |Réserves facul|
|            |tatives et ext|
|            | raordinaires |
|16/10/2011  |Autres emprunt|
|            |s a long terme|
|            |aupres d'autre|
|            |preteurs      |
|------------|--------------|

j'aimerai insérer une condition dans le code qui concatène
tant que la ligne suivante commence par"| |"
merci.
Commenter la réponse de bourgeoisvalere
bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 24 juil. 2013 à 10:27
0
Utile
et donne le résultat sous cette forme
date de saisie    intitulé complet du compte
16/10/2011          Capital social 
16/10/2011       reserves facultatives et extraordinaires
16/10/2011       Autres emprunt a long terme aupres d'autres preteurs


Commenter la réponse de bourgeoisvalere
labandus 25 Messages postés jeudi 14 décembre 2000Date d'inscription 25 juillet 2013 Dernière intervention - 24 juil. 2013 à 11:48
0
Utile
excuse moi...
mon ton explication est encore floue:

tu donnes un nouveau tableau avec un nouveau format.. avec des entrées dupliquées...

tu as deux parties:
|16/10/2011  |Capital social|
|16/10/2011  |Réserves facul|
|            |tatives et ext|
|            | raordinaires |
|16/10/2011  |Autres emprunt|
|            |s a long terme|
|            |aupres d'autre|
|            |preteurs      |


qui sont separées par

|------------|--------------|
|611300 en EUR              |
|------------|------------- |


et tu voudrais un resultat similaire à celui d'avant ?

tu dis

j'aimerai insérer une condition dans le code qui concatène
tant que la ligne suivante commence par"| |"


mais toutes lignes ont
"| |"
, non ?

s'il te plait clarifie..
merci
Commenter la réponse de labandus
bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 24 juil. 2013 à 12:45
0
Utile
j'aimerai avoir une condition qui me permet d'obtenir le resultat suivant:
a partir du fichier source
date de saisie    intitulé complet du compte
16/10/2011          Capital social 
16/10/2011       reserves facultatives et extraordinaires
16/10/2011       Autres emprunt a long terme aupres d'autres preteurs
611300 en EUR
16/10/2011          Capital social 
16/10/2011       reserves facultatives et extraordinaires
16/10/2011       Autres emprunt a long terme aupres d'autres preteurs
Commenter la réponse de bourgeoisvalere
bourgeoisvalere 7 Messages postés samedi 19 février 2011Date d'inscription 25 juillet 2013 Dernière intervention - 25 juil. 2013 à 16:30
0
Utile
et aussi est ce possible d'avoir a la fin du fichier le total des montant d'une colonne comme sous cet exemple.
merci.




AVANT LE FORMATAGE


|+++++++|++++++++++++++|++++|++++++++++++++++++|++++++++++++++++++|++++++++++++++++++|
|Num du |Intitulé compl|Dev |   Sld Init Déb   |  Sld Init Créd   |    Mvts Débit    |   
|compte | et du compte |    |                  |                  |                  |           
|+++++++|++++++++++++++|++++|++++++++++++++++++|++++++++++++++++++|++++++++++++++++++|
|101000 |Capital social|XAF |                  |    10 000 000 000|     0  		     |    
|-------|--------------|----|------------------|------------------|------------------|
|121000 |Réserve légale|XAF |                  |       900 000 000|     0 	         |         
|-------|--------------|----|------------------|------------------|------------------|
|123000 |Réserves facul|XAF |                  |     3 392 715 994|     0            |                 
|       |tatives et ext|    |                  |                  |         |                  
|       | raordinaires |    |                  |                  |                  |        
|-------|--------------|----|------------------|------------------|------------------|

APRES LE FORMATAGE

Numducompte Intitulécompletducompte Dev SldInitDéb SldInitCréd  MvtsDébit      
101000          Capital social      XAF 10000000000   0  	 0	       
121000         Réservelégale        XAF 900000000     0	         0         
123000       Réservesfacul...       XAF 3 392 715 994 0          0           
  0               0                  0  3392715994    0          0  		     
Commenter la réponse de bourgeoisvalere

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.