Missa inte Amazon Prime Day i Dagens fynd

Logisk numrering. (ej programspecifikt)

Permalänk
Medlem

Logisk numrering. (ej programspecifikt)

Behöver lite hjälp med numrering.
Skriver ett program i VBA som ska byta filnamn på filer.
Användaren väljer vilka filer som han/hon vill byta namn på.
Skriver in namnet i en textruta. Väljer startnummer och klickar på 'byt namn'.

Programmet byter då filnamnen till namn_nummer.
Nummer är en siffra som kommer från dels startnummer (det användaren själv väljer) och "en loopad siffra" (kan inte komma på ett bättre namn så här tidigt på morgonen).

Exempel:
Användaren väljer 5 filer,
Namn blir "Test"
Och startnummer 3
Ger följande resultat:

Test_3
Test_4
Test_5
Test_6
Test_7

Problemet:
När antalet går över 10 vill jag att de som är under 10 ska heta "_0#" samt "_0##" och "_00#" vid över 100.
Hur gör jag detta på lättaste sätt?
Måste jag ställa upp en serie if-satser?
If startnummer + antal_filer >10 then
och sen i denna if sats kolla om själva siffran är över eller under?

Känns som det borde finnas en bättre lösning.
Kan ni inte VBA så skriv koden i annat språk, det är inte direkt ett programspecifikt problem. Snarare ett rent logiskt bekymmer

Permalänk
Avstängd

Du får först kolla hur många filer det är. Om det är fler än 10, så ska du slå ihop "_0" med for loopens inkrement. Om det är fler är än 100 filer så ska du slå ihop "_00" med for loopens inkrement.

if (filAntal > 100)
prefix = "_00"
else if (filAntal >10)
prefix = "_0"
else
prefix = ""

for (fil = 0; fil < filAntal; fil++)
filnamn = prefix + fil
renameFromTo (fil,filnamn)

Permalänk
Medlem

Fungerar det här:

Format(NUMMER, "0000")

?

Du behöver då räkna ut hur många siffror långt det största talet blir och ge den så många 0r som det andra argumentet.

Permalänk
Hedersmedlem

Du skulle kunna ha en liten loop som räknar ut hur många nollor som ska läggas till. Du får dela(Antalet filer - start) med 10 och om kvoten är >=1 så kan du lägga till en nolla i prefixet.

En snabb tanke bara nu på morgonen. Peta gärna hål i det om ni hittar något.

Permalänk

I python, x ska vara från 0 till num_files -1.

def num2str(x, start_num, num_files): zeros = "000000000000000000000" num_c = len(str(start_num+num_files-1)) return zeros[0:(num_c)-len(str(start_num+x))] + str(start_num+x)

Permalänk
Medlem

Nystan hade helt klart den smidigaste lösningen!
Tack! Det funkade perfekt!

Shimonu, mmm. det hade nog funkat men det hade blivit en del extra beräkninar samt en del if-satser.

Saddam, det var den lösningen jag försökte mig på igår kväll.
problemet blir att jag måste ha dubbla if satser.
en för att kolla totala antalet och en för att hålla koll på om det är en eller två nollor som ska in.

ex:
test_001
..
test_050
...
test_100

Jag måste då veta vad indexsiffran är varje gång jag loopar.

Jop. Det var ett språk jag hade lite problem med
men om jag förstår det rätt så ska jag kolla längden på variablen? ex 15=2 och på så vis veta antalet 0:or.
Är osäker på om det få fram längden på en variabel som inte är sträng i VBA.
Helt klart en fungerande lösning om det funkar.

Tack för hjälpen alla!
Uppskattas

Permalänk
Medlem

Använd log10 för att ta reda på hur många nollor du behöver.

EDIT:
Kände att jag behöver förklara lite mer

Om vi ska vara icke språkspecifika:

räkna fram hur många nollor det är totalt, log10(antal_filer), sedan använder du dig av totalt_nollor - log10(fil_nummer) för att ta reda på hur många nollor det är framför just den här filen.

Men i ditt fall räcker det med log10(antal_filer) och sedan köra på det nystan sa

Visa signatur

citera!

Permalänk
Medlem

Faktum är att det Nystan sa var hela lösningen.
Detta blev den slutliga koden (för den delen).

If UBound(Files) + StartNumber < 10 Then Number = Format(a + StartNumber, "0") If UBound(Files) + StartNumber > 9 Then Number = Format(a + StartNumber, "00") If UBound(Files) + StartNumber > 99 Then Number = Format(a + StartNumber, "000")

Files är en array med filerna som användaren har valt, Ubound ger mig antalet filer.
a är min "loopade siffra", dvs filnummret.
Så resultatet av detta är att om UBound(Files)= 200 kommer, Number bli "001" eftersom Format säger att det ska vara tresiffrigt.

EDIT: jag är mycket väl medveten om att jag borde skriva koden så här istället:

If UBound(Files) + StartNumber < 10 Then Number = Format(a + StartNumber, "0") If UBound(Files) + StartNumber > 9 And UBound(Files) + StartNumber < 100 Then Number = Format(a + StartNumber, "00") If UBound(Files) + StartNumber > 99 Then Number = Format(a + StartNumber, "000")

Men ibland måste utseende gå före funktion
Jag räknar kallt med att det mycket sällan kommer användas mer än 100 filer och, om det ändå skulle göras så är en rad kod inget problem.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Agonotheta

If UBound(Files) + StartNumber < 10 Then Number = Format(a + StartNumber, "0") If UBound(Files) + StartNumber > 9 And UBound(Files) + StartNumber < 100 Then Number = Format(a + StartNumber, "00") If UBound(Files) + StartNumber > 99 Then Number = Format(a + StartNumber, "000")

Men ibland måste utseende gå före funktion
Jag räknar kallt med att det mycket sällan kommer användas mer än 100 filer och, om det ändå skulle göras så är en rad kod inget problem.

Det skulle ju gå att förenkla lite (med risk för syntaxfel i min kod).

Dim MaxNum as Long = UBound(Files) + StartNumber If MaxNum < 10 Then Number = Format(a + StartNumber, "0") ElseIf MaxNum < 100 Then Number = Format(a + StartNumber, "00") ElseIf MaxNum < 1000 Then Number = Format(a + StartNumber, "000") ... EndIf

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av nystan
Du behöver då räkna ut hur många siffror långt det största talet blir och ge den så många 0r som det andra argumentet. [/B]

Och det jag svarade på var hur man får fram hur ånga nollor det skall vara. Att if-satsa sig fram är inte speciellt smart, då det inte är en generell lösning och pajar om man t.ex. skulle ha 10 000 filer.

Jag kan inte VBA men detta borde ge ett hum om vad jag menar:

antal_nollor = Log(UBound(Files) + StartNumber)/log(10) //eller en log10(UBound(Files) + StartNumber) om det finns i VBA number = Format(a+StartNumber, String$(antal_nollor,"0"))

Visa signatur

citera!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jop_the_jopsan
I python, x ska vara från 0 till num_files -1.

def num2str(x, start_num, num_files): zeros = "000000000000000000000" num_c = len(str(start_num+num_files-1)) return zeros[0:(num_c)-len(str(start_num+x))] + str(start_num+x)

Faktum är att det där är fel, inte funktionellt men det finns funtioner för strängformatering i standard biblioteket som _bör_ användas. Se exempel (med lite magi lånad från Dosshell).

# Strängformatering # X: antalet 0r att fylla med # n: talet print '%0Xd' % n

from math import log10 N = ANTAL_FILER P = "prefix (text före nummer)" S = "suffix (text efter nummer)" [P + ('%0' + str(int(log10(N))+1) + 'd') % c + S for c in range(1, N+1)]

Eller utan log10

N = ANTAL_FILER P = "prefix (text före nummer)" S = "suffix (text efter nummer)" [P + ('%0' + str(len(str(N))) + 'd') % c + S for c in range(1, N+1)]

Permalänk
Hedersmedlem

Jaha, jag antog att det skulle funka för vilket antal filer som helst. Men du vill bara ha för en maxgräns med hundratal?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av nystan
...

N = ANTAL_FILER
P = "prefix (text före nummer)"
S = "suffix (text efter nummer)"
[P + ('%0' + str(int(log10(N))+1) + 'd') % c + S for c in range(1, N+1)]
[/code]
[/B]

Just det, givetvis sak det vara +1

Visa signatur

citera!

Permalänk
Medlem

Nja. jag vill inte påstå att det är en gräns när man kan byta namn på 999 filer samtidigt.
Sen har jag mycket svårt att någon, någonsin skulle maxa den gränsen.
Hur ofta har du själv behövt byta namn på 1000+ filer till 'samma namn'?

Det där med Log() verkar vara en bra lösning för att slippa if, men frågan är om jag vinner något på det.
Ja, i nästa version ändrar jag kanske det.

Tack för all hjälp

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Agonotheta
Nja. jag vill inte påstå att det är en gräns när man kan byta namn på 999 filer samtidigt.
Sen har jag mycket svårt att någon, någonsin skulle maxa den gränsen.
Hur ofta har du själv behövt byta namn på 1000+ filer till 'samma namn'?

Det är visst en gräns, och jag har passerat den ett antal gånger. Dessutom finns det ingen anledning att inskränka sig när det finns en generell lösning som är lika enkel (om inte enklare).

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Det är visst en gräns, och jag har passerat den ett antal gånger. Dessutom finns det ingen anledning att inskränka sig när det finns en generell lösning som är lika enkel (om inte enklare).

Fast för prestanda-anledningar kan det vara bra att undvika mer komplicerade matematiska operationer, fast när det handlar om en sån simpel sak som inte kommer repeteras en väldans massa gånger efter varandra så är det bäst att göra det mest generella.

(Btw, jag hittade Format funktionen genom en enkel googling (de flesta språk har inbyggda funktioner/* för att formatera strängar). En mer internationell term för vad TS försöker göra är "zero padding" kan vara bra att nämna om någon vill spana på hur man effektivast gör det i sitt favorit språk.)

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av You
Det är visst en gräns, och jag har passerat den ett antal gånger. Dessutom finns det ingen anledning att inskränka sig när det finns en generell lösning som är lika enkel (om inte enklare).

Vi andra brukar namnge våra låtar med [artist]_[låtnamn], inte Mp3_1, Mp3_2, Mp3_3 osv

Men seriöst, när behövde du namnge 999+ filer? Vad var det?

Permalänk

Bilder är ett bra exempel för mig. Om du har en systemkamera med x antal 16GB och 8GB minnen så kan det lätt hända att man har mer än 1000 filer som man vill ha med samma namn.

Visa signatur

[i7 2600k @ 5GHz| NH-D14, fläktar utbyta mot ljudlösa 120mm SySS 800| Asus P8P67| HD6870 DirectCU| Corsair 4x8GB (32GB) 1600MHz DDR3| Moddat Corsair 550VX | Mac Pro / G5 Chassi| 2x120GB raid0 Intel 520 sys+ 2x3TB slask & home (riktig lagring på 12TB ZRAID NAS som även home backuppas/rsyncas till) ] - Helt ljudlös om man inte lägger örat intill chassit
[ MacBook Pro Retina 13 | 16GB ram | 256GB PCIe SSD | OS X(main), Arch ]

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Agonotheta
Vi andra brukar namnge våra låtar med [artist]_[låtnamn], inte Mp3_1, Mp3_2, Mp3_3 osv

Men seriöst, när behövde du namnge 999+ filer? Vad var det?

Fotografier, mappar med 1000+ LaTeX-dokument jag ville ha i nummerordning.
Det spelar egentligen inte roll hur ofta det händer, poängen är att man med ingen extra effort kan göra något som fungerar i alla tänkbara fall.