boucle saut de ligne

Le
---DGI972---
Bonjour,

Je n'arrive pas a structurer ma boucle pour créer un fichier de sortie
comme je veux. J'aurais besoin d'un coup de pouce.
J'ai un fichier en entrée:

1
1MTVJ06000005 1 0MTV101CAB000
1MTVJ06000005 2 0MTV101CAB001
1MTVJ06000005 3 0MTV101CAB100
1MTVJ06000005 4 0MTV101ROD999
1MTVJ06000005 5 0MTV101DET102
1MTVJ06000005 6 0MTV101DET101
1MTVJ06000005 7 0MTV101DET191
1MTVJ06000005 8 0MTV101DET199
1
1MTVJ06000010 1 0MTV101CAB000
1MTVJ06000010 2 0MTV101CAB001
1MTVJ06000010 3 0MTV101CAB100
1MTVJ06000010 4 0MTV101ROD999
1MTVJ06000010 5 0MTV101DET102
1MTVJ06000010 6 0MTV101DET101
1MTVJ06000010 7 0MTV101DET101
1MTVJ06000010 8 0MTV101DET191
1MTVJ06000010 9 0MTV101DET199
1
1MTVJ06000016 1 0MTV101CAB000
1MTVJ06000016 2 0MTV101CAB001
1MTVJ06000016 3 0MTV101CAB100
1MTVJ06000016 4 0MTV101ROD999
1MTVJ06000016 5 0MTV101DET102
1MTVJ06000016 6 0MTV101DET101
1MTVJ06000016 7 0MTV101DET191
1MTVJ06000016 8 0MTV101DET199

et je voudrais en sortie

1
1MTVJ06000005 1 0MTV101CAB000

1MTVJ06000005 2 0MTV101CAB001

1MTVJ06000005 3 0MTV101CAB100

1MTVJ06000005 4 0MTV101ROD999

1MTVJ06000005 5 0MTV101DET102










1MTVJ06000005 6 0MTV101DET101










1MTVJ06000005 7 0MTV101DET191










1MTVJ06000005 8 0MTV101DET199
1
1MTVJ06000010 1 0MTV101CAB000

1MTVJ06000010 2 0MTV101CAB001

1MTVJ06000010 3 0MTV101CAB100

1MTVJ06000010 4 0MTV101ROD999

1MTVJ06000010 5 0MTV101DET102










1MTVJ06000010 6 0MTV101DET101
1MTVJ06000010 7 0MTV101DET101








1MTVJ06000010 8 0MTV101DET191

1MTVJ06000010 9 0MTV101DET199
1
1MTVJ06000016 1 0MTV101CAB000

1MTVJ06000016 2 0MTV101CAB001

1MTVJ06000016 3 0MTV101CAB100

1MTVJ06000016 4 0MTV101ROD999

1MTVJ06000016 5 0MTV101DET102
1MTVJ06000016 6 0MTV101DET102
1MTVJ06000016 6 0MTV101DET102







1MTVJ06000016 7 0MTV101DET191

1MTVJ06000016 8 0MTV101DET199

Je veux faire un saut de ligne lorsque que je vois des CAB et ROD en
position 29 lg 3 et dix sauts de ligne quand je vois des DET et des MSB
sauf que lorsqu'il y a n fois concécutif les DET101 ou DET102 ou DET103
ou DET191 et les MSG001 et MSG002 il ne faut pas les séparer par des
sauts de ligne entre eux mais après faire le complément de 10 sauts de
lignes (par ex: si 4 DET101 concécutifs et il faut 6 saut de lignes).

Voila mon début de code mais je ne trouve pas comment connaitre la
ligne d'avant ou d'après pour s'avoir si je fais les 10 sauts de ligne.

Set file1 = fso.OpenTextFile("D:CABLE_CABLE.txt")
Set file2 = fso.OpenTextFile("D:CABLE_CABLE2.txt",2, True)

Do Until file1.AtEndOfStream
SLine2 = file1.ReadLine

NOUV=Mid(SLine2,29,6)

if Mid(SLine2,29,3)="CAB" then Sline2=Sline2&vbcrlf

if Mid(SLine2,29,3)="ROD" then Sline2=Sline2&vbcrlf

if Mid(SLine2,29,6)="DET101" and ANC="DET101" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET102" and ANC="DET102" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET103" and ANC="DET103" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET191" and ANC="DET191" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf

if Mid(SLine2,29,6)="MSG001" and ANC="MSG001" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="MSG002" and ANC="MSG002" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf

file2.Writeline SLine2
ANC=NOUV
loop

fileOut.Close

Je sais qu'il manque la boucle pour le complément à 10 des sauts de
ligne mais je ne sais pas par quel bout la prendre aussi.

Un peu beaucoup perdu en fait

DGI972
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
---DGI972---
Le #19541261
jbongran a écrit :
"---DGI972---" de news:
Bonjour,

Je n'arrive pas a structurer ma boucle pour créer un fichier de sortie
comme je veux. J'aurais besoin d'un coup de pouce.
J'ai un fichier en entrée:

1
1MTVJ06000005 1 0MTV101CAB000
1MTVJ06000005 2 0MTV101CAB001
1MTVJ06000005 3 0MTV101CAB100
1MTVJ06000005 4 0MTV101ROD999
1MTVJ06000005 5 0MTV101DET102
1MTVJ06000005 6 0MTV101DET101
1MTVJ06000005 7 0MTV101DET191
1MTVJ06000005 8 0MTV101DET199
1
1MTVJ06000010 1 0MTV101CAB000
1MTVJ06000010 2 0MTV101CAB001
1MTVJ06000010 3 0MTV101CAB100
1MTVJ06000010 4 0MTV101ROD999
1MTVJ06000010 5 0MTV101DET102
1MTVJ06000010 6 0MTV101DET101
1MTVJ06000010 7 0MTV101DET101
1MTVJ06000010 8 0MTV101DET191
1MTVJ06000010 9 0MTV101DET199
1
1MTVJ06000016 1 0MTV101CAB000
1MTVJ06000016 2 0MTV101CAB001
1MTVJ06000016 3 0MTV101CAB100
1MTVJ06000016 4 0MTV101ROD999
1MTVJ06000016 5 0MTV101DET102
1MTVJ06000016 6 0MTV101DET101
1MTVJ06000016 7 0MTV101DET191
1MTVJ06000016 8 0MTV101DET199

et je voudrais en sortie

1
1MTVJ06000005 1 0MTV101CAB000

1MTVJ06000005 2 0MTV101CAB001

1MTVJ06000005 3 0MTV101CAB100

1MTVJ06000005 4 0MTV101ROD999

1MTVJ06000005 5 0MTV101DET102










1MTVJ06000005 6 0MTV101DET101










1MTVJ06000005 7 0MTV101DET191










1MTVJ06000005 8 0MTV101DET199
1
1MTVJ06000010 1 0MTV101CAB000

1MTVJ06000010 2 0MTV101CAB001

1MTVJ06000010 3 0MTV101CAB100

1MTVJ06000010 4 0MTV101ROD999

1MTVJ06000010 5 0MTV101DET102










1MTVJ06000010 6 0MTV101DET101
1MTVJ06000010 7 0MTV101DET101








1MTVJ06000010 8 0MTV101DET191

1MTVJ06000010 9 0MTV101DET199
1
1MTVJ06000016 1 0MTV101CAB000

1MTVJ06000016 2 0MTV101CAB001

1MTVJ06000016 3 0MTV101CAB100

1MTVJ06000016 4 0MTV101ROD999

1MTVJ06000016 5 0MTV101DET102
1MTVJ06000016 6 0MTV101DET102
1MTVJ06000016 6 0MTV101DET102







1MTVJ06000016 7 0MTV101DET191

1MTVJ06000016 8 0MTV101DET199

Je veux faire un saut de ligne lorsque que je vois des CAB et ROD en
position 29 lg 3 et dix sauts de ligne quand je vois des DET et des MSB
sauf que lorsqu'il y a n fois concécutif les DET101 ou DET102 ou DET103
ou DET191 et les MSG001 et MSG002 il ne faut pas les séparer par des
sauts de ligne entre eux mais après faire le complément de 10 sauts de
lignes (par ex: si 4 DET101 concécutifs et il faut 6 saut de lignes).

Voila mon début de code mais je ne trouve pas comment connaitre la
ligne d'avant ou d'après pour s'avoir si je fais les 10 sauts de ligne.

Set file1 = fso.OpenTextFile("D:CABLE_CABLE.txt")
Set file2 = fso.OpenTextFile("D:CABLE_CABLE2.txt",2, True)

Do Until file1.AtEndOfStream
SLine2 = file1.ReadLine

NOUV=Mid(SLine2,29,6)

if Mid(SLine2,29,3)="CAB" then Sline2=Sline2&vbcrlf

if Mid(SLine2,29,3)="ROD" then Sline2=Sline2&vbcrlf

if Mid(SLine2,29,6)="DET101" and ANC="DET101" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET102" and ANC="DET102" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET103" and ANC="DET103" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="DET191" and ANC="DET191" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf

if Mid(SLine2,29,6)="MSG001" and ANC="MSG001" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf
if Mid(SLine2,29,6)="MSG002" and ANC="MSG002" then
Sline2=Sline2&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf&vbcrlf

file2.Writeline SLine2
ANC=NOUV
loop

fileOut.Close

Je sais qu'il manque la boucle pour le complément à 10 des sauts de
ligne mais je ne sais pas par quel bout la prendre aussi.

Un peu beaucoup perdu en fait ...

DGI972



Si j'ai bien compris ta demande, ce script devrait convenir:

Dim fso, fileIn, fileOut, strLine
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set fileIn = fso.OpenTextFile("e:testdgi.txt", 1, False, -2)
Set fileOut = fso.OpenTextFile("e:testdgi_out.txt", 2, True, -2)
Do Until fileIn.AtEndOfStream
strLine = fileIn.ReadLine
If Trim(strLine) <> "1" Then
strLine = strLine & vbCrLf
End If
fileOut.WriteLine strLine
Loop
fileIn.Close
fileOut.Close
Set fileIn = Nothing
Set fileOut = Nothing
Set fso = Nothing



Bonjour,

Non c'est beaucoup plus compliqué que ca:
il faut mettre 1 seul vbcrlf si l'on rencontre un CAB ou un ROD en
position 23 lg 3
et 10 vbcrlf si c'est un DET ou MSG mais si il y a plusieur DT ou MSB
concécutif (par ex: pour 2 x DET101 à la suite il faut pas faire de
vbcrlf entre eux et aprés le dernier DET 101 mettre 8 vbcrlf).

merci encore
jbongran
Le #19542121
"---DGI972---" message de news:
jbongran a écrit :


[...]
Non c'est beaucoup plus compliqué que ca:
il faut mettre 1 seul vbcrlf si l'on rencontre un CAB ou un ROD en
position 23 lg 3
et 10 vbcrlf si c'est un DET ou MSG mais si il y a plusieur DT ou MSB
concécutif (par ex: pour 2 x DET101 à la suite il faut pas faire de vbcrlf
entre eux et aprés le dernier DET 101 mettre 8 vbcrlf).

merci encore



Pour une raison que j'ignore, je n'ai carrément pas vu la suite de ton
message après le début de l'exemple de sortie.
Maintenant si je reprend ton message, effectivement la "solution" proposée
ne peut convenir, c'est le moins que l'on puisse dire.
J'étais quand même étonné que tu demandes quelque chose d'aussi simple ;-)
---DGI972---
Le #19545951
Le 11/06/2009, jbongran a supposé :
"---DGI972---" de news: [...]
Bonjour,

Non c'est beaucoup plus compliqué que ca:
il faut mettre 1 seul vbcrlf si l'on rencontre un CAB ou un ROD en
position 23 lg 3
et 10 vbcrlf si c'est un DET ou MSG mais si il y a plusieur DT ou MSB
concécutif (par ex: pour 2 x DET101 à la suite il faut pas faire de
vbcrlf entre eux et aprés le dernier DET 101 mettre 8 vbcrlf).

merci encore



J'essaye de me rattraper ;-)

Option Explicit
Dim fso, fileIn, fileOut, strLine, strTemp, strType, strPreviousType
Dim cpt, strReturnLine, blnDoIt, strRL
cpt = 10
blnDoIt = False
strPreviousType = ""
strRL = VbCrLf
strReturnLine = ""
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set fileIn = fso.OpenTextFile("e:testdgi.txt", 1, False, -2)
Set fileOut = fso.OpenTextFile("e:testdgi_out.txt", 2, True, -2)
Do Until fileIn.AtEndOfStream
strLine = Trim(fileIn.ReadLine)
strType = Mid(strLine, 28, 6)
Select Case Left(strType, 3)
Case "DET", "MSG"
blnDoIt = True
If strPreviousType = "" Then
strPreviousType = strType
fileOut.WriteLine strReturnLine & strLine
cpt = 9
Else
If strPreviousType = strType Then
fileOut.WriteLine strLine
cpt = cpt -1
Else
strPreviousType = strType
WriteLineReturns cpt
fileOut.WriteLine strLine
cpt = 9
End If
End If
Case Else
If blnDoIt Then
WriteLineReturns cpt
strPreviousType = ""
blnDoIt = False
cpt = 10
End If
If strLine = "1" Then
fileOut.WriteLine strLine
strReturnLine = ""
Else
fileOut.WriteLine strReturnLine & strLine
strReturnLine = VbCrLf
End If
End Select
Loop
If blnDoIt Then WriteLineReturns cpt -1
fileIn.Close
fileOut.Close
Set fileIn = Nothing
Set fileOut = Nothing
Set fso = Nothing

Sub WriteLineReturns(intHowMany)
Dim i
For i = 1 To intHowMany
fileOut.WriteLine
Next
End Sub



YES WE CAN

C'est plus que du rattrage ...
merci ca colle
Gilles LAURENT [MVP]
Le #19548311
"---DGI972---" message de
news:

Bonjour,

[...]
| YES WE CAN

;-)

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
---DGI972---
Le #19570671
jbongran a écrit :
"---DGI972---" de news: [...]
Bonjour,

Non c'est beaucoup plus compliqué que ca:
il faut mettre 1 seul vbcrlf si l'on rencontre un CAB ou un ROD en
position 23 lg 3
et 10 vbcrlf si c'est un DET ou MSG mais si il y a plusieur DT ou MSB
concécutif (par ex: pour 2 x DET101 à la suite il faut pas faire de
vbcrlf entre eux et aprés le dernier DET 101 mettre 8 vbcrlf).

merci encore



J'essaye de me rattraper ;-)

Option Explicit
Dim fso, fileIn, fileOut, strLine, strTemp, strType, strPreviousType
Dim cpt, strReturnLine, blnDoIt, strRL
cpt = 10
blnDoIt = False
strPreviousType = ""
strRL = VbCrLf
strReturnLine = ""
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set fileIn = fso.OpenTextFile("e:testdgi.txt", 1, False, -2)
Set fileOut = fso.OpenTextFile("e:testdgi_out.txt", 2, True, -2)
Do Until fileIn.AtEndOfStream
strLine = Trim(fileIn.ReadLine)
strType = Mid(strLine, 28, 6)
Select Case Left(strType, 3)
Case "DET", "MSG"
blnDoIt = True
If strPreviousType = "" Then
strPreviousType = strType
fileOut.WriteLine strReturnLine & strLine
cpt = 9
Else
If strPreviousType = strType Then
fileOut.WriteLine strLine
cpt = cpt -1
Else
strPreviousType = strType
WriteLineReturns cpt
fileOut.WriteLine strLine
cpt = 9
End If
End If
Case Else
If blnDoIt Then
WriteLineReturns cpt
strPreviousType = ""
blnDoIt = False
cpt = 10
End If
If strLine = "1" Then
fileOut.WriteLine strLine
strReturnLine = ""
Else
fileOut.WriteLine strReturnLine & strLine
strReturnLine = VbCrLf
End If
End Select
Loop
If blnDoIt Then WriteLineReturns cpt -1
fileIn.Close
fileOut.Close
Set fileIn = Nothing
Set fileOut = Nothing
Set fso = Nothing

Sub WriteLineReturns(intHowMany)
Dim i
For i = 1 To intHowMany
fileOut.WriteLine
Next
End Sub


Bonjour,

J'ai une nouvelle condition a rajouter ...

Le fichier commence tjrs par des xxxxxxxxxxCAB, il y a tjrs un
xxxxxxxxDET102 mais pas forcement des xxxxxxxxxDET101 après et c'est la
le PB.
Je souhaiterais 10 crlf en plus après le DET102 quand il n'y a pas de
DET101.

Je peux réouvrir le fichier et le refermer une nouvelle fois pour cette
nouvelle condition cela me pose pas de pb.
Gilles LAURENT [MVP]
Le #19582701
"---DGI972---" message de
news:
| Bonjour,

Bonjour,

| J'ai une nouvelle condition a rajouter ...
[...]

Ci-dessous une version alternative à celle de Jérôme intégrant la
nouvelle condition. En espérant que cela répondra à votre besoin.

Usage :
> type dgi.txt | cscript //nologo codesnippet.vbs>dgi_out.txt

--- CodeSnippet.vbs ---
Set oRe=New RegExp: oRe.Pattern="((^1|DET|MSG)d{0,})"
nMaxCrLf=9: nCrLf=0: sCode="1"
aLines=Split(WScript.StdIn.ReadAll(), VBCrLf)
For Each sLine In aLines
If Not oRe.Test(sLine) Then
WScript.Echo sLine & VBCrLf
Else
sNewCode=oRe.Execute(sLine)(0)
If sCode<>sNewCode And sCode<>"1" Then
If sCode="DET102" And sNewCode<>"DET101" Then nMaxCrLf
For nIndex=1 To nMaxCrLf-nCrLf: WScript.Echo: Next
WScript.Echo sLine
nMaxCrLf=9: nCrLf=0
Else
WScript.Echo sLine
If sCode<>"1" Then nCrLf=nCrLf+1
End If
sCode=sNewCode
End If
Next
--- CodeSnippet.vbs ---

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
---DGI972---
Le #19589971
Gilles LAURENT [MVP] a écrit :
"---DGI972---" message de
news:
Bonjour,



Bonjour,

J'ai une nouvelle condition a rajouter ...


[...]

Ci-dessous une version alternative à celle de Jérôme intégrant la
nouvelle condition. En espérant que cela répondra à votre besoin.

Usage :
> type dgi.txt | cscript //nologo codesnippet.vbs>dgi_out.txt

--- CodeSnippet.vbs ---
Set oRe=New RegExp: oRe.Pattern="((^1|DET|MSG)d{0,})"
nMaxCrLf=9: nCrLf=0: sCode="1"
aLines=Split(WScript.StdIn.ReadAll(), VBCrLf)
For Each sLine In aLines
If Not oRe.Test(sLine) Then
WScript.Echo sLine & VBCrLf
Else
sNewCode=oRe.Execute(sLine)(0)
If sCode<>sNewCode And sCode<>"1" Then
If sCode="DET102" And sNewCode<>"DET101" Then nMaxCrLf
For nIndex=1 To nMaxCrLf-nCrLf: WScript.Echo: Next
WScript.Echo sLine
nMaxCrLf=9: nCrLf=0
Else
WScript.Echo sLine
If sCode<>"1" Then nCrLf=nCrLf+1
End If
sCode=sNewCode
End If
Next
--- CodeSnippet.vbs ---



AAHhhhhhhhh berk en cscript
Les accents sont mal convertis.
:'(
Gilles LAURENT [MVP]
Le #19590361
"---DGI972---" message de
news:
|
| AAHhhhhhhhh berk en cscript
| Les accents sont mal convertis.
| :'(

Je pense avoir répondu au cahier des charges ;-)
Ils sont où les accents ?

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
---DGI972---
Le #19590881
Gilles LAURENT [MVP] a écrit :
"---DGI972---" message de
news:

AAHhhhhhhhh berk en cscript
Les accents sont mal convertis.
:'(



Je pense avoir répondu au cahier des charges ;-)
Ils sont où les accents ?



Pour des raisons de confidentialités j'ai tronqué le véritable fichier.
Et ce n'est que la partie visible de l'iceberg, je fais une traitement
avant et aprés le fait de faire 10 crlf selon les différentes
conditions.
Gilles LAURENT [MVP]
Le #19592411
"---DGI972---" message de
news:

Bonjour,

| Pour des raisons de confidentialités j'ai tronqué le véritable
| fichier. Et ce n'est que la partie visible de l'iceberg, je fais une
| traitement avant et aprés le fait de faire 10 crlf selon les
| différentes conditions.

Pour conserver les caractères accentués lors du traitement tout en
restant dans la même philosophie, c'est à dire en ligne de commande en
s'affranchissant du FSO, vous pouvez procéder de la manière suivante :

--- batch.cmd ---
@echo off
type dgi.txt | cscript //nologo codesnippet.vbs>dgi_temp.txt
cmd /u /c type dgi_temp.txt>dgi_out.txt
del dgi_temp.txt
--- batch.cmd ---

Note: Le fichier de sortie dgi_out.txt sera au format Unicode

--
Gilles LAURENT
MVP Windows Server - Admin Frameworks
http://glsft.free.fr
Publicité
Poster une réponse
Anonyme