1 (изменено: alexii, 2012-06-21 14:21:45)

Тема: VBScript: Подсчет суммы чисел в колонке файла csv

Здравствуйте, всем!
Есть такая задача:

Имеется файл csv такого вида:

текст1;текст2;текст3
10.10.3.131;484;191
10.10.3.131;347;503
10.10.3.131;514;210
10.10.3.131;510;190
10.10.3.131;347;503
10.10.3.131;514;210
10.10.3.131;510;190
10.10.3.131;347;503
10.10.3.131;514;211
10.10.3.131;510;190
10.10.3.131;514;210
10.10.3.131;347;503

Нужно сложить числа в первой и во второй колонке, а результат сохранить в новом фале вида:

текст2=
текст3=

Помогите, пожалуйста, чем сможете .

2

Re: VBScript: Подсчет суммы чисел в колонке файла csv

Ну, по большому счёту, сие не есть csv-файл.

С помощью Log Parser:

Option Explicit

Dim objFSO

Dim strSourceFile

Dim objLogQuery
Dim objCOMTSVInputContext
Dim objRecord

Dim strQueryPart
Dim i


If WScript.Arguments.Count = 1 Then
    strSourceFile = WScript.Arguments.Item(0)
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    
    If objFSO.FileExists(strSourceFile) Then
        Set objLogQuery = WScript.CreateObject("MSUtil.LogQuery")
        Set objCOMTSVInputContext = WScript.CreateObject("MSUtil.LogQuery.TSVInputFormat")
        
        With objCOMTSVInputContext
            .iCodepage  = 1251
            .iSeparator = ";"
        End With
        
        strQueryPart = ""
        
        With objLogQuery.Execute("SELECT * FROM '" & strSourceFile & "'", objCOMTSVInputContext)
            For i = 3 To .getColumnCount() - 1
                strQueryPart = strQueryPart & "SUM(" & .getColumnName(i) & ") AS " & .getColumnName(i) & ", "
            Next
            
            strQueryPart = Left(strQueryPart, Len(strQueryPart) - 2)
            
            .close
        End With
        
        With objLogQuery.Execute("SELECT " & strQueryPart & " FROM '" & strSourceFile & "'", objCOMTSVInputContext)
            Set objRecord = .getRecord()
            
            For i = 0 To .getColumnCount() - 1
                WScript.StdOut.WriteLine .getColumnName(i) & "=" & CStr(objRecord.getValue(i))
            Next
            
            Set objRecord = Nothing
            
            .close
        End With
        
        Set objCOMTSVInputContext = Nothing
        Set objLogQuery           = Nothing
    Else
        WScript.StdOut.WriteLine "Source file [" & strSourceFile & "] not found"
        
        WScript.Quit 2
    End If
    
    Set objFSO = Nothing
Else
    WScript.StdOut.WriteLine "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ ""<Source file>"""
    
    WScript.Quit 1
End If

WScript.Quit 0

Примерный вызов:

cscript.exe //nologo "c:\My Scripts\Script.vbs" "c:\Temp\FileIn.csv">"e:\FileOut.txt"

3 (изменено: DIMMon, 2012-06-21 18:09:42)

Re: VBScript: Подсчет суммы чисел в колонке файла csv

Что-то я не так делаю. Ругается

logparser.vbs(21, 9) WScript.CreateObject: Could not locate automation class named "MSUtil.LogQuery".

После переустановки парсера стал ругаться на

logparser.vbs(41, 9) CLogQueryClass: Error parsing query: Syntax Error: <sqlfunction-expr>: no matching closing parenthesis [SQL query syntax invalid or unsupported.]

4

Re: VBScript: Подсчет суммы чисел в колонке файла csv

1. На выложенном Вами образце пробовали?

2. Подробно опишите проделанные Вами действия, чтобы я мог воспроизвести ошибку.

5

Re: VBScript: Подсчет суммы чисел в колонке файла csv


Option Explicit
Const CsvFile1 = "qwe.csv" 'читаем
Const CsvFile2 = "qwe.txt" 'пишем
Dim fso, arr, i, x, y, newCsvFile

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(CsvFile1) Then
	MsgBox "Файл " & CsvFile1 & " не найден"
	WScript.Quit
End If

arr = ReadCSV(CsvFile1) 'читаем

For i = 1 To UBound(arr,2) 'считаем
	x = x + CInt(arr(1,i))
	y = y + CInt(arr(2,i))
Next

With fso	
	If Not .FileExists(CsvFile2) Then
		Set newCsvFile = .CreateTextFile(CsvFile2)
		newCsvFile.Close	
	End If
	
	Set newCsvFile = .OpenTextFile(CsvFile2,8)
	With newCsvFile 'пишем
		.WriteLine arr(1,0) & " = " & x
		.WriteLine arr(2,0) & " = " & y		
		.Close
	End With
End With

Function ReadCSV(filePath)	
	Dim dataArray() 
	Dim splitArray 
	Dim i, j 
	i = 0
	With fso.OpenTextFile(filePath) 		
		Do Until .AtEndOfStream 			
			splitArray = Split(.ReadLine, ";")			
			ReDim Preserve dataArray(2, i)		
			For j = 0 To 2
				dataArray(j, i) = splitArray(j)
			Next				
			i = i + 1				
		Loop
		.Close
	End With
	ReadCSV = dataArray
End Function

6 (изменено: alexii, 2012-06-22 02:51:59)

Re: VBScript: Подсчет суммы чисел в колонке файла csv

dab00, спасибо! Работает! А что надо изменить в скрипте, если перед колонками с числами будет не одна колонка, а три?

7

Re: VBScript: Подсчет суммы чисел в колонке файла csv

qwe.csv:

текст1;текст2;текст3;текст4;текст5;текст6
10.10.3.131;10;11;484;aa;191
10.10.3.131;10;11;347;aa;503
10.10.3.131;10;11;514;aa;210
10.10.3.131;10;11;510;aa;190
10.10.3.131;10;11;347;aa;503
10.10.3.131;10;11;514;aa;210

Option Explicit
Const CsvFile1 = "qwe.csv" 'читаем
Const CsvFile2 = "qwe.txt" 'пишем
Const ColNumber = 5 'количество колонок (от 0)
Dim fso, arr, k, m, n, x, y, newFile
Dim arr2 'массив номеров колонок для счета (от 0)
arr2 = Array(3,5) 'например 3-я и 5-я колонки

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(CsvFile1) Then
	MsgBox "Файл " & CsvFile1 & " не найден"
	WScript.Quit
End If

arr = ReadCSV(CsvFile1, ColNumber) 'читаем

With fso	
	If Not .FileExists(CsvFile2) Then
		Set newFile = .CreateTextFile(CsvFile2)
		newFile.Close	
	End If
	
	Set newFile = .OpenTextFile(CsvFile2,8)
	With newFile 
		For k = 0 To UBound(arr2)		
			m = 0
			For n = 1 To UBound(arr,2) 'считаем			
				m = m + CInt((arr(arr2(k),n)))
			Next
			.WriteLine arr(arr2(k),0) & " = " & m 'пишем
		Next
		.Close
	End With
End With

Function ReadCSV(filePath, intColNumber)	
	Dim dataArray() 
	Dim splitArray 
	Dim i, j 
	i = 0
	With fso.OpenTextFile(filePath) 		
		Do Until .AtEndOfStream 			
			splitArray = Split(.ReadLine, ";")			
			ReDim Preserve dataArray(intColNumber, i)		
			For j = 0 To intColNumber
				dataArray(j, i) = splitArray(j)
			Next				
			i = i + 1				
		Loop
		.Close
	End With
	ReadCSV = dataArray
End Function

8

Re: VBScript: Подсчет суммы чисел в колонке файла csv

DIMMon, избегайте излишнего цитирования. Я поправил Ваш пост.

9

Re: VBScript: Подсчет суммы чисел в колонке файла csv

dab00, «ReDim Preserve» — это тихий ужас. Считайте суммы сразу по ходу чтения и разбора строки.

10

Re: VBScript: Подсчет суммы чисел в колонке файла csv

alexii, не стреляйте в пианиста

11 (изменено: DIMMon, 2012-06-22 12:10:57)

Re: VBScript: Подсчет суммы чисел в колонке файла csv

dab00, скрипт работает до этой строчки

83.149.2.103;[21/Jun/2012:21:22:59;+0400];552;37920

а потом ошибка

logparser2.vbs(29, 17) Microsoft VBScript runtime error: Overflow: 'CInt'

что в этой строке не так? Слишком большое значение?
изменил значения на


Const ColNumber = 4 'количество колонок (от 0)
arr2 = Array(3,4) 'например 3-я и 5-я колонки

12 (изменено: DIMMon, 2012-06-22 16:05:09)

Re: VBScript: Подсчет суммы чисел в колонке файла csv

Остальные строчки тоже содержат, но ругается только на последнюю.

83.149.2.103;[21/Jun/2012:21:22:57;+0400];531;4112
83.149.2.103;[21/Jun/2012:21:22:58;+0400];528;24350
83.149.2.103;[21/Jun/2012:21:22:58;+0400];554;10033
83.149.2.103;[21/Jun/2012:21:22:58;+0400];550;825
83.149.2.103;[21/Jun/2012:21:22:59;+0400];550;549
83.149.2.103;[21/Jun/2012:21:22:59;+0400];553;5128
83.149.2.103;[21/Jun/2012:21:22:59;+0400];551;1383
83.149.2.103;[21/Jun/2012:21:22:59;+0400];549;1997
83.149.2.103;[21/Jun/2012:21:22:59;+0400];555;2509
83.149.2.103;[21/Jun/2012:21:22:59;+0400];547;712
83.149.2.103;[21/Jun/2012:21:22:59;+0400];551;691
83.149.2.103;[21/Jun/2012:21:22:59;+0400];552;37920

получается, что если файл содержит число больше 32767, то скрипт выдает эту ошибку
integer только до 32767
CInt поменял на CLng и все заработало.
Спасибо всем за помощь. Очень помогли