VBScript从文本文件创建CSV

时间:2016-05-20 18:07:08

标签: string csv batch-file vbscript

我想从某些空格分隔的某些字符串创建CSV文本文件,但空间量未知。即:

fname lname         Degree          Test3
City                experience

////////////////////////////////////////////////////////////////////////////////

fname2 lname2           Degree2         Test32
City2               experience2

////////////////////////////////////////////////////////////////////////////////

fname3 lname3           Degree3         Test33
City3               experience3

////////////////////////////////////////////////////////////////////////////////

我希望输出像

fname,lname,Degree,Test3,City,Experience  
fname2,lname2,Degree2,Test32,City2,Experience2
fname3,lname3,Degree3,Test33,City,Experience3

请注意,使用的变量不是固定宽度,而是会发生变化。我该怎么做才能将所有不同的字符串变为实际变量?我能够在批处理中做一半工作但是:

BATCH1

    SETLOCAL ENABLEDELAYEDEXPANSION
    for /F "tokens=*" %%I in (C:\Users\bonhkarl01\Desktop\Test.txt) do (

    set str=%%I
    set str=!str:           =,!
    set str=!str: =,!
    set str=!str:   =!
    echo.!str! >> "C:\Users\bonhkarl01\Desktop\Test2.txt"
    )

    findstr /v /b /c:"-----------------------------------------------------------------" C:\Users\bonhkarl01\Desktop\Test2.txt > C:\Users\bonhkarl01\Desktop\Test3.txt

Batch2

@echo off
setlocal enabledelayedexpansion
for /f %%a in (C:\Users\bonhkarl01\Desktop\Test3.txt) do (set "string=!string!%%a,")
set "string=%string:~0,-1%"
echo.%string%> "C:\Users\bonhkarl01\Desktop\Test4.txt"
pause

会给我以下输入:

fname,lname,Degree,Test3,City,experience,fname2,lname2,Degree2,Test32,City2,experience2,fname3,lname3,Degree3,Test33,City3,experience3

但批次中仍然知道宽度。

2 个答案:

答案 0 :(得分:3)

你的问题有一个很大的问题,很遗憾,很常见:你没有描述你的问题,你只是展示了一些确实代表的示例数据真实数据。当问题的规范不完整时,我们只能猜测缺少的信息,在这种情况下,OP回复频繁:“你的程序不适用于我的真实数据”。为了解决这个问题,我假设文件中的每组数据都由一个带有65个破折号的行分开(与您在示例代码中使用的相同)。这是我使用的数据文件:

fname lname         Degree          Test3
City                experience

-----------------------------------------------------------------

fname2 lname2           Degree2         Test32
City2               experience2

-----------------------------------------------------------------

fname3 lname3           Degree3         Test33
City3               experience3

-----------------------------------------------------------------

这是解决问题的批处理代码:

@echo off
setlocal EnableDelayedExpansion

set "line="
(for /F "delims=" %%a in (Test.txt) do (
   for %%b in (%%a) do (
      if "%%b" equ "-----------------------------------------------------------------" (
         echo !line:~1!
         set "line="
      ) else (
         set "line=!line!,%%b"
      )
   )
)) > output.txt

这是输出:

fname,lname,Degree,Test3,City,experience
fname2,lname2,Degree2,Test32,City2,experience2
fname3,lname3,Degree3,Test33,City3,experience3

答案 1 :(得分:0)

非常感谢您的回答!它会有效。我刚从提供商处获得了一个新文件......他改变了一切!这是输出:

(文件开始) 69

FirstName LastName

加蒂诺,QC(42公里)

Universitaire 

2016-02-17

69

FirstName LastName

加蒂诺,QC(43公里)

Universitaire

2016年2月17日

(文件结束)

我能用VBScript来实现它。

For t = 0 to uBound(FileContentsAray)
    If Len(FileContentsAray(t)) > 0 Then
        LineCount = LineCount + 1
        If LineCount = 2 Then 
            unnom = split(FileContentsAray(t)," ")



        if uBound(unnom) > 1 Then
            if ubound(unnom) = 4 Then
                WriteInFile NewFile, unnom(0) & " " & unnom(1)  & "," & unnom(2)& " " & unnom(3)
            else
                WriteInFile NewFile, unnom(0) & " " & unnom(1) & "," & unnom(2)
            end if
        else
            if uBound(unnom) = 0 Then 
                WriteInFile NewFile, unnom(0)
            else 
                WriteInFile NewFile, unnom(0) & "," & unnom(1)
            end if

        end if

        End if
        If LineCount = 5 Then LineCount = 0

    End If
Next