Programavimas

padalyti komandą, skirtą DOS / Windows „Via Groovy“

Viena iš komandų, kurios man labiausiai trūksta iš „Linux“ dirbant „Windows“ / DOS aplinkoje, yra „split“ komanda. Ši itin patogi komanda leidžia padalyti didelį failą į kelis mažesnius failus, nustatomus pagal eilių skaičių arba baitų (arba kilobaitų ar megabaitų) skaičių, norimą mažesniems failams. Tokiam funkcionalumui yra daugybė būdų, įskaitant failų pritaikymą tam tikroje laikmenoje, failų „perskaitymą“, kad programos būtų ribojamos failų ilgio ir pan. Deja, aš nežinau apie padalytą „Windows“ ar „DOS“ atitikmenį. „PowerShell“ gali būti parašyta, kad būtų galima atlikti kažką panašaus, bet tas diegimas yra būdingas „PowerShell“. Taip pat yra trečiųjų šalių produktų, kurie atlieka panašų funkcionalumą. Tačiau šie esami sprendimai palieka tik tiek, kad būtų norima, jog turėčiau motyvacijos įgyvendinti „Groovy“ padalytą atitikmenį ir tai yra šio pranešimo tema. Kadangi „Groovy“ veikia JVM, teoriškai šis diegimas gali būti vykdomas bet kurioje operacinėje sistemoje, kurioje įdiegta moderni „Java Virtual Machine“.

Norint išbandyti ir parodyti „Groovy“ pagrindu veikiantį padalijimo scenarijų, reikalingas tam tikro tipo šaltinio failas. Norėdami lengvai sugeneruoti šį šaltinio failą, naudosiu „Groovy“. Šis paprastas „Groovy“ scenarijus buildFileToSplit.groovy sukuria paprastą tekstinį failą, kurį galima padalyti.

#! / usr / bin / env groovy // // buildFileToSplit.groovy // // Priima vieną argumentą eilučių skaičiui, kuris bus įrašytas į sugeneruotą failą. // Jei nenurodytas eilučių skaičius, naudojamas numatytasis 100 000 eilučių. // if (! args) {println "\ n \ nNaudojimas: buildFileToSplit.groovy fileName lineCount \ n" println ", kur fileName yra sukuriamo failo pavadinimas, o lineCount yra" println "eilučių, kurios bus dedamos į sugeneruotą, skaičius failą. " System.exit (-1)} fileName = args [0] numberOfLines = args.length> 1? args [1] kaip Sveikasis skaičius: 100000 file = new File (fileName) // ištrina išvesties failą, jei jis jau egzistavo file.delete () 1.upto (numberOfLines, {file << "Tai eilutė # $ {it}. \ n "}) 

Šis paprastas scenarijus naudoja netiesiogiai prieinamą Groovy rankeną „args“, kad pasiektų komandų eilutės argumentus scenarijaus buildFileToSplit.groovy. Tada jis sukuria vieną dydžio failą pagal pateiktą eilučių skaičiaus argumentą. Kiekviena eilutė yra daugiausiai neoriginali ir nurodo „Tai yra eilutė #“, po kurios nurodomas eilutės numeris. Tai nėra išgalvotas šaltinio failas, tačiau jis tinka skaidymo pavyzdžiui. Kitame ekrano momentiniame vaizde rodoma, kaip jis veikia, ir jo išvestis.

Sugeneruotas source.txt failas atrodo taip (čia rodoma tik jo pradžia ir pabaiga):

Tai yra 1 eilutė. Tai yra 2 eilutė. Tai yra 3 eilutė. Tai yra 4 eilutė. Tai yra 5 eilutė. Tai yra 6 eilutė. Tai yra 7 eilutė. Tai yra 8 eilutė. Tai yra 9 eilutė. Tai yra 10 eilutė. . . . Tai yra 239 eilutė. Tai yra 240 eilutė. Tai yra eilutė Nr. 241. Tai yra eilutė Nr. 242. Tai yra eilutė Nr. 243. Tai yra eilutė Nr. 244. Tai yra eilutė Nr. 245. Tai yra eilutė Nr. 246. Tai yra eilutė Nr. 247. Tai yra eilutė Nr. 248. Tai yra eilutė Nr. 249. Tai yra 250 eilutė. 

Dabar yra šaltinio failas, kurį galima padalyti. Šis scenarijus yra žymiai ilgesnis, nes aš jį priverčiau patikrinti daugiau klaidų sąlygų, nes jis turi tvarkyti daugiau komandinės eilutės parametrų ir paprasčiausiai todėl, kad jis daro daugiau nei scenarijus, kuris sugeneravo šaltinio failą. Scenarijus, tiesiog vadinamas split.groovy, rodomas toliau:

#! / usr / bin / env groovy // // split.groovy // // Padalykite vieną failą į kelis failus panašiai kaip veikia „Unix / Linux split //“ komanda. Ši scenarijaus versija skirta tik tekstiniams failams. // // Šis scenarijus tam tikrais būdais skiriasi nuo „Linux / Unix“ varianto. Pavyzdžiui, // scenarijaus išvesties pranešimai skiriasi keliais atvejais, o šiam // scenarijui reikia, kad skaidomo failo pavadinimas būtų nurodomas kaip // komandinės eilutės argumentas, o ne suteikiant galimybę jį pateikti kaip // standartinę įvestį . Šiame scenarijuje taip pat pateikiama parinktis „-v“ („--version“), kuri // nėra reklamuojama „Linux“ / „Unix“ versijai. // // DĖMESIO: Šis scenarijus yra skirtas tik iliustracijai, kaip „Groovy“ naudoti // komandai „Unix / Linux“ imituoti. Jis nėra skirtas gamybai // naudoti tokį, koks yra. Šis scenarijus skirtas padaryti atsargines failų, sukurtų // iš vieno šaltinio failo padalijimo, kopijas, tačiau yra sukurta tik viena atsarginė versija //, kurią pakeis visos kitos užklausos. // // //marxsoftware.blogspot.com/ // importuoti java.text.NumberFormat NEW_LINE = System.getProperty ("line.separator") // // Naudokite Groovy's ClientBuilder komandų eilutės argumentams apdoroti // def cli = naujas „CliBuilder“ (naudojimas: „split [OPTION] [INPUT [PREFIX]]“) cli.with {h (longOpt: 'help', 'Usage Information') a (longOpt: 'suffix-length', type: Number, ' Naudokite N ilgio priesagas (numatytasis nustatymas yra 2), argumentai: 1) b (longOpt: „bytes“, tipas: skaičius, „Kiekvieno išvesties failo dydis baitais“, argumentai: 1) l (longOpt: „eilutės“, tipas: skaičius, „Eilučių skaičius išvesties faile“, argumentai: 1) t (longOpt: „verbose“, „Print diagnostical to standard error prieš pat atidarant kiekvieną išvesties failą“, argumentai: 0) v (longOpt: 'version ',' Išvesties versija ir išėjimas ', args: 0)} def opt = cli.parse (args) if (! Opt || opt.h) {cli.usage (); return} if (opt.v) {println "Versija 0.1 (2010 m. liepos mėn.)"; return} if (! opt.b &&! opt.l) {println "Nurodykite padalytų failų ilgį naudodami baitų arba eilučių skaičių" cli.usage () return} if (opt.a &&! opt.a. isNumber ()) {println "Priesagos ilgis turi būti skaičius"; cli.usage (); grįžti} if (opt.b &&! opt.b.isNumber ()) {println "Failų dydis baitais turi būti skaičius"; cli.usage (); grįžti} if (opt.l &&! opt.l.isNumber ()) {println "Eilučių skaičius turi būti skaičius"; cli.usage (); return} // // Nustatykite, ar padalyti failai bus didinami pagal eilučių skaičių ar baitų skaičių // privatus sąrašas LINES_OR_BYTES_ENUM {BYTES, LINES} bytesOrLines = LINES_OR_BYTES_ENUM.LINES def suffixLength = opt.a? opt.a.toBigInteger (): 2 if (suffixLength 1? opt.arguments () [1]: "x" pabandykite {file = new File (failo pavadinimas) if (! file.exists ()) {println "Source file $ {filename} nėra tinkamas šaltinio failas. "System.exit (-4)} int fileCounter = 1 firstFileName =" $ {prefix} $ {fileSuffixFormat.format (0)} "if (verboseMode) {System.err.println "Kuriamas failas $ {firstFileName} ..."} outFile = createFile (firstFileName) if (bytesOrLines == LINES_OR_BYTES_ENUM.BYTES) {int byteCounter = 0 file.eachByte {if (byteCounter <numberBytes) {outFile << nauja eilutė (it )} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)}" if (verboseMode) {System.err.println "Failo kūrimas $ {nextOutputFileName} ..."} outFile = createFile (nextOutputFileName) outFile << new String (it) fileCounter ++ byteCounter = 0} byteCounter ++}} else {int lineCounter = 0 file.eachLine {if (lineCounter <numberLines) {outFile << it << NEW_LINE} else {nextOutputFileName = "$ {prefix} $ {fileSuffixFormat.format (fileCounter)} " if (verboseMode) {System.err.println "Kuriamas failas $ {nextOutputFileName} ..."} outFile = createFile (nextOutputFileName) outFile << tai << NEW_LINE fileCounter ++ lineCounter = 0} lineCounter ++}}} catch (FileNotFoundException) println System.properties println "$ {fileName} nėra tinkamas šaltinio failas: $ {fnfEx.toString ()}" System.exit (-3)} catch (NullPointerException npe) {println "Susidūrė NullPointerException: $ {npe.toString ()} "System.exit (-4)} / ** * Sukurkite failą su nurodytu failo pavadinimu. * * @param fileName Kuriamo failo pavadinimas. * @return Failas sukurtas nurodytu vardu; null, jei pateiktas vardas yra nulinis arba * tuščias. * / def File createFile (String fileName) {if (! fileName) {println "Negalima sukurti failo iš tuščio ar tuščio failo pavadinimo." grąžinti null} outFile = naujas failas (failo pavadinimas), jei (outFile.exists ()) {outFile.renameTo (naujas failas (failo vardas + ".bak")) outFile = naujas failas (failo pavadinimas)} grąžinti failą} 

Šį scenarijų būtų galima optimizuoti ir geriau moduliuoti, tačiau jis atitinka savo tikslą - parodyti, kaip „Groovy“ suteikia puikų požiūrį įgyvendinant nuo platformos nepriklausomus naudingumo scenarijus.

Kitas ekrano momentas rodo scenarijaus naudojimąsi įmontuotu Groovy CLI palaikymu.

Kiti du ekrano momentiniai vaizdai rodo, kad šaltinio failas padalijamas į mažesnius failus pagal atitinkamai eilutės numerius ir baitus (ir naudojant skirtingas priesagos ir failo pavadinimo parinktis). Pirmasis vaizdas rodo, kad trys išvesties failai sugeneruojami padalijus į 100 eilučių (250 eilučių šaltinio faile). Parinktis -a nurodo, kad failo pavadinime bus keturios sveiko skaičiaus vietos. Skirtingai nei „Linux“ padalijimas, šis scenarijus negarantuoja, kad vartotojo pateiktas sveikųjų skaičių skaičius yra pakankamas, kad būtų padengtas būtinų išvesties failų skaičius.

Antrame paveikslėlyje (kitame paveikslėlyje) rodomas scenarijus, suskaidantis šaltinio failą pagal baitų skaičių ir sunumeravus kitą failo pavadinimą ir tik du skaičius.

Kaip minėta pirmiau, šis scenarijus yra „grubus pjūvis“. Jį būtų galima patobulinti kalbant apie patį kodą ir funkcionalumą (išplėstas siekiant geriau palaikyti dvejetainius formatus ir įsitikinti, kad failų pavadinimų galūnės yra pakankamai ilgos išvesties failų skaičiui). Tačiau scenarijus čia parodo vieną iš mano mėgstamiausių „Groovy“ naudojimo būdų: rašyti nuo platformos nepriklausomus scenarijus naudojant žinomas „Java“ ir „Groovy“ bibliotekas (SDK ir GDK).

Šią istoriją „split Command for DOS / Windows Via Groovy“ iš pradžių paskelbė „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found