![]() |
China DOS Union-- Unite DOS · Advance DOS · Grow DOS --Union site: www.cn-dos.net Forum site: www.cn-dos.net/forum |
| Guest | Log in | Register | Members | Search | China DOS Union |
|
中国DOS联盟论坛 The time now is 2026-11-11 14:32 |
47,815 topics / 349,930 posts / today 0 new / 48,291 members |
| DOS批处理 & 脚本技术(批处理室) » [Help] Convert from original text file to another format text file |
| Printable Version 4,902 / 40 |
| Floor31 slore | Posted 2008-02-01 03:26 |
| 铂金会员 Posts 2,478 Credits 5,212 | |
|
PS: The speed of vbs should be quite fast... I don't have specific data, you can test it yourself.
|
|
| Floor32 dhlmdsnw | Posted 2008-02-01 11:30 |
| 初级用户 Posts 59 Credits 127 | |
|
Thank you very much for the help from user slore. After using the code from you, the following small issues occur:
Please help take a look again: 1. OutStr = OutStr & "14080005020214080100112003624143" & AddZero(i,6) OutStr = OutStr & "00000000001775000000000000000000072 " 'Is there a missing 2 above? The meaning of 2 is unclear. I'm really sorry that I missed writing a 1. 2 represents the detailed line, and 1 represents the summary line. It should be as follows: OutStr = OutStr & "114080005020214080100112003624143" & AddZero(i,6) OutStr = OutStr & "00000000001775000000000000000000072 " 2. In addition, the 17750 in the last summary line of my file is not fixed but variable. The rules are as follows: The last line in file b is the summary line. In this example, there are only three places that change. One is the sequence number: 8, one is the summary data: 17750, and one is the summary number: 7. That is to say, the preceding 114080005020214080100112003624143 is fixed. The following 000008 is variable and is filled in sequentially from the serial number of the previous line (for example: if the previous line is 000011, this place in the next line is 000012; if the previous line is 000111, this place becomes 000112). Then the following 00 is fixed. And the following 00000000177500 is variable. 00000000177500 is the summary number of the corresponding positions of all previous lines (for example: the data of the corresponding position of line 1 is 000000000270200 + the data of the corresponding position of line 1 is 000000000250000 +.... + the data of the corresponding position of line 7 is 000000000250000 = 00000000177500). Then the following 000000000000000007 is variable, which is used to represent the total number of previous lines (for example: if there are 100 lines before the last line, this position data should be 000000000000000100). The final 2 (including the blank) are all fixed. 3. In each line generated by your code, the blank bytes after the name are gone. The rule for "name + subsequent blank bytes" is as follows: What is needed is the result that "name + subsequent blank" is all selected, and then copy and paste it into the cell of Excel. Use the function len to verify. If the name is two characters, the return value of len for "name + subsequent blank" is 51; if the name is three characters, the return value of len for "name + subsequent blank" is 50; if the name is four characters, the return value of len for "name + subsequent blank" is 49. For the last summary line, the number of blank bytes needed after the last data 2 is represented by the return value of the len function in Excel as 82 bytes. After all the above details are processed, the generated file, when all selected with Ctrl+A, the blue screen is filled for each line without any blank, and the number of bytes in each line should be equal in the text file. Please continue to improve this code for me! Thank you very much! |
|
| Floor33 slore | Posted 2008-02-01 12:31 |
| 铂金会员 Posts 2,478 Credits 5,212 | |
|
Can't understand VBA? Can't modify it appropriately by yourself... You get up really early...
Example2+.vbs:
|
|
| Floor34 dhlmdsnw | Posted 2008-02-01 12:54 |
| 初级用户 Posts 59 Credits 127 | |
|
Sorry, big brother, my VBA is also very amateurish. I just started learning. I'm still in the process of studying. I can't say I can do it. I also came into this halfway. I just started learning for three months. At first, it was all about how to operate in Excel. So far, I've only learned about text import and export knowledge. I haven't tried it yet. After hearing your lesson, I'm very apprehensive. I'll reply to you first.
Studying hard. In the future, I still need big brother to continue to help! Testing... 감사합니다! |
|
| Floor35 dhlmdsnw | Posted 2008-02-01 18:22 |
| 初级用户 Posts 59 Credits 127 | |
|
Report to Great Slore, I used the great's code. Although some small problems occurred, with the great's guidance, I have learned a lot. These small problems are determined to be overcome by myself. Otherwise, how can I make progress... After working hard for a long time, I finally understood the main reason. The return value of the Len function when applied in Excel 2000 is 1 for one Chinese character, while one Chinese character occupies two bytes in a text file. Although the result may be scorned by the greats, after all, it is my own summary. I also explain to the great that I am actively studying, not just a lazy person who only wants code. At the same time, I have learned many essences while studying the great's code... Now I upload the slightly modified code of myself:
Const ForReading = 1 'Set the way to open the text as reading Const ForWriting = 2 'Set the way to open the text as writing Const ForAppending = 8 'Set the way to open the text as appending Const InFile = "a.txt" 'Set the text to be opened Dim i, Sum Dim StrLine, OutStr i = 1: Sum = 0 'On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") 'Reference the FSO object, which is needed for reading and writing files Set objFile = objFSO.OpenTextFile(InFile, ForReading) 'Open InFile in reading mode Do Until objFile.AtEndOfStream StrLine = objFile.ReadLine 'Read a line If Len(StrLine) Then 'If it is not an empty line StrLine = FixStr(StrLine) NeedData = Split(StrLine, " ") If Right(NeedData(1), 1) = "*" Then NeedData(1) = Left(NeedData(1), Len(NeedData(1)) - 1) NeedData(4) = NeedData(4) & Space(53 - Len(NeedData(4)) * 2) OutLine = "2140800050202" & mid((NeedData(1) & space(10)), 1, 19) & "3" & AddZero(i, 6) & "00" & NeedData(2) OutLine = OutLine & "000000000000000011 " & AddZero(i - 1, 9) & NeedData(4) OutStr = OutStr & OutLine & vbCrLf i = i + 1 Sum = Sum + CLng(NeedData(2)) End If Loop OutStr = OutStr & "114080005020214080100112003624143" & AddZero(i, 6) OutStr = OutStr & "00" & AddZero(Sum, 15) & "0000000" & AddZero(i - 1, 10) & "2" & Space(82) objFile.Close 'Close the file object OutFile = "140800050" & FormatDate(Date) & "001.txt" Set objFile = objFSO.OpenTextFile(OutFile, ForWriting, True) 'Open OutFile in writing mode objFile.Write OutStr objFile.Close 'Close the file object Set objFile = Nothing Set objFSO = Nothing Function FixStr(StrExp) Do While InStr(StrExp, " ") StrExp = Replace(StrExp, " ", " ") Loop FixStr = StrExp End Function Function FormatDate(tDate) FormatDate = Right(Year(tDate), 2) & AddZero(Month(tDate), 2) & AddZero(Day(tDate), 2) End Function Function AddZero(sNum, iLen) Addzero = Right("00000000000" & sNum, iLen) End Function Really thank you, Great Slore, for your help. Please be sure to continue to help me in the future... Thanks in advance! This problem has been solved. Thank you all greats for your attention and support. 감사합니다! Studying hard... |
|
| Floor36 slore | Posted 2008-02-01 18:56 |
| 铂金会员 Posts 2,478 Credits 5,212 | |
|
I originally wanted to ask about that in Chinese. Just felt it was a bit strange.
But if you did that *2, it wouldn't be right if it's in English... But it should all be in Chinese... |
|
| Floor37 dhlmdsnw | Posted 2008-02-01 19:02 |
| 初级用户 Posts 59 Credits 127 | |
|
Yes, currently in actual operation, it's still only in Chinese. What if English appears? -- Can the Great One provide me with an improved general version?...... Hehe...... Don't blame me for being greedy......
감사합니다! |
|
| Floor38 slore | Posted 2008-02-01 19:36 |
| 铂金会员 Posts 2,478 Credits 5,212 | |
|
Even supports mixed Chinese and English names... Sweat~ There shouldn't be, right?
Only one place was changed, len was changed to MixLen. Example++.vbs:
|
|
| Floor39 dhlmdsnw | Posted 2008-02-01 21:10 |
| 初级用户 Posts 59 Credits 127 | |
|
Wow, Great Slore, you're so cool...
Excuse me, may I ask about the Mixlen function? |
|
| Floor40 slore | Posted 2008-02-01 21:28 |
| 铂金会员 Posts 2,478 Credits 5,212 | |
|
MsgBox MixLen("I am Slore") 'Returns the result 9.
'MixLen treats Chinese as 2 lengths, and numbers, English letters, and some symbols '(Common characters have ASCII codes within 0 to 128) 'Treated as 1 length. Function MixLen(StrExp) Dim i,c For i = 1 To Len(StrExp) c = Asc(Mid(StrExp, i, 1)) If Not (C >= 0 And C < 128) Then MixLen = MixLen + 1 MixLen = MixLen + 1 Next End Function |
|
| Floor41 dhlmdsnw | Posted 2008-02-01 21:33 |
| 初级用户 Posts 59 Credits 127 | |
|
Wow, this is awesome!!! ——Great job!
Learn first and then bookmark! ——Remember it firmly! Whisper a word: Slore, little sister opened a new thread, come over and visit! Thank you very much! http://www.cn-dos.net/forum/viewthread.php?tid=37490&sid=eXmTWk |
|
| Prev 1 2 3 |
|
[ Contact the Union admin team -
中国DOS联盟 -
Standard version ] Sponsored by ifanr Inc | © 2001–2023 |