Wątek przeniesiony 2021-01-28 13:21 z Inne języki programowania przez cerrato.

Który język szybciej niż VBS przeprocesuje podane dane?

0

Hej, mam w pliku txt ponad sto tysięcy linii tekstu w układzie jak poniżej, wartości znajdują się w kolumnach oddzielonych znakiem "|"

| 2000194743|23.01.2020|01|23.01.2020| 5,055.77 |USD |USCD|DR |2020/01 | 1|2020|0168|01681239 |>

Skrypt napisany w VBS wyciąga z każdej linii trzy wartości, sprawdza kilka IFów na tych wartościach, jeśli potrzeba to je skraca i wpisuje te trzy dane do pliku CSV tworząc w nim trzy kolumny. Całe zadanie trwa około dwie - trzy godziny. W jakim języku analogiczny skrypt potrwałby krócej i jakie to mogą być różnice w czasie?
Pozdrawiam

2

Stawiam na to, że ten kod w VBS jest źle napisany i wczytujesz cały plik do pamięci.

Dowolne rozwiązanie, które potrafi to zrobić strumieniowo powinno to załatwić w kilka minut.
Ja bym zrobił to w Python.
Jeśli sposób odfiltrowania/przekształcenia danych jest w miarę prosty, to użyłbym po prostu: sed

najlepiej pokaż ten kod VBS, a ktoś kto się na nim zna, poprawi ci go w 5 minut lub ci powie jak to poprawić.

0

Z tym, że plik jest wczytywany cały to racja, część kodu odpowiedzialna za obrabianie wygląda tak:

Set txtFile = fso.OpenTextFile(pathSource & "\sales_fbl5n.txt") 'otwiera txt do czytania
Set salesFile = fso.CreateTextFile(pathTABLES & "\" & dataAA & "_sales.csv") 'output csv do ktorego kopiuje wszystko

	salesFile.WriteLine ( """period""" & "," & _
						  """plant""" & "," &_
						  """salesAm""" )
		
		z=0 ' ideks linii z pliku txt
		Do Until txtFile.AtEndOfStream
			line = txtFile.ReadLine
			arrLine = split(line,"|")
			If z>10 and UBound(arrLine)>11 Then
			
				If trim(arrLine(12)) <> "" AND trim(arrLine(12)) <> "Plnt" Then
			
					if left(trim(arrLine(12)),1)="0" then
						plant = right(trim(arrLine(12)),3)
					else
						plant = trim(arrLine(12))
					end if
					'period = trim(arrLine(11)) & right("0" & trim(arrLine(10)), 2)
					salesAm = trim(arrLine(5))
						IF right(salesAm,1)="-" THEN 
							salesAm = cdbl(left(salesAm,len(salesAm)-1)*-1)
						ELSE
							IF  salesAm <> "" THEN
								salesAm = cdbl(salesAm)
							ELSE
								salesAm = 0
							END IF
						END IF
				
					salesFile.WriteLine(period & "," & plant & "," & salesAm)
					
				End If			  
			End If
			z=z+1
		Loop
	salesFile.close
	txtFile.close

Dodaję jeszcze fragment z pliku txt wraz z nazwami kolumn:

|  DocumentNo|Doc..Date |PK|Pstng Date|   Amt in loc.cur.|LCurr|BusA|Typ|Year/month| Period|Year|Plnt|Ref. Key 1  |
-------------------------------------------------------------------------------------------------------------------
|  2000007189|03.01.2020|01|03.01.2020|         2,368.12 |USD  |USCD|DR |2020/01   |      1|2020|7209|72096047    |
|  2000008904|03.01.2020|01|03.01.2020|         4,669.23 |USD  |USCD|DR |2020/01   |      1|2020|7181|71811239    |
0

Poprawnie napisany program w większości języków powinien zająć nie więcej niż kilka sekund przy takim rozmiarze danych

0

100k linii? W czymkolwiek zrobisz to w przeciągu sekundy, w jakimś pythonie pewnie w 10 linijkach kodu.

0
MarekR22 napisał(a):

https://ideone.com/Lgfali

Wielkie dzięki, nawet po dodaniu kilku ifów do sprawdzania wartości w pojedynczych komórkach cały skrypt działa niecałe dwie sekundy.

data = open(inputFile, "r")
def transform_csv(data):
	reader = csv.DictReader(data, delimiter='|')
	next(reader) #skips separator
	for item in reader:
		period, plant, salesAm = item[' Period'].strip(), item['Plnt'].strip(), item['   Amt in loc.cur.'].strip()
		if plant:
			period = '20200' + period
			if salesAm.endswith('-'):
				salesAm = '-' + salesAm[:-1]
			yield  period, plant, salesAm

with open('C:/Users/Workspace/sales.csv', 'w', newline='') as file:
	writer = csv.writer(file)
	for i in transform_csv(data):
		writer.writerow(i)

Możecie mi powiedzieć dlaczego ten skrypt w VBS działał tak długo? Nie za bardzo wiem o co chodzi z tymi strumieniami/ładowaniem całego pliku, po prostu nie widzę wielkiej różnicy między tymi skryptami.

0

Ktoś strzelał do wróbla z armaty.
Zamiast uzyć normalnych polecen, Open, Write, to używał cięzkich jak jasna cholera obiektow.

1 użytkowników online, w tym zalogowanych: 0, gości: 1