You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.3 KiB
125 lines
3.3 KiB
#!/usr/bin/env python
|
|
'''
|
|
mtoldtonew
|
|
----------
|
|
This script uses mtoldtonew.csv to convert node names in "we" schem
|
|
file(s). The destination filename(s) are generated automatically. Each
|
|
will have "new" instead of "old" if the original file had "old" in the
|
|
name. Otherwise, it will have "new" added to the beginning of the name.
|
|
|
|
Usage:
|
|
python3 mtoldtonew.py <filename>
|
|
or
|
|
python3 mtoldtonew.py <filenames>
|
|
|
|
Examples:
|
|
python3 mtoldtonew.py palm_oldnodes.we
|
|
python3 mtoldtonew.py palm_oldnodes.we palm.we
|
|
|
|
* Example 2 yields: palm_newnodes.we and newpalm.we
|
|
with all nodes replaced according to csv.
|
|
(adds "new" to beginning if "old" is not in specified filename)
|
|
|
|
* only replaces node names surrounded by quotes
|
|
- you can change that behavior using python:
|
|
from mtoldtonew import oldToNew
|
|
oldToNew('file.we', quotechar='')
|
|
|
|
edit '%s' as needed (old name in column 1, new name in 2)
|
|
'''
|
|
from __future__ import print_function
|
|
import os
|
|
import csv
|
|
import sys
|
|
|
|
mtdeltas_csv = "mtoldtonew.csv"
|
|
if not os.path.isfile(mtdeltas_csv):
|
|
print("ERROR: missing " + mtdeltas_csv)
|
|
# exit(1)
|
|
|
|
files = []
|
|
|
|
def usage():
|
|
print(__doc__)
|
|
|
|
|
|
mtdeltas = {}
|
|
|
|
|
|
def stripQuotes(s, quotechar='"'):
|
|
if (len(s) >= 2) and (s[0] == quotechar) and (s[-1] == quotechar):
|
|
s = s[1:-1]
|
|
return s
|
|
|
|
|
|
def quoted(str1, quotechar='"'):
|
|
return(quotechar + str1 + quotechar)
|
|
|
|
|
|
def replaceQuoted(str1, deltas, quotechar='"'):
|
|
ret = str1
|
|
for k, v in deltas.items():
|
|
ret = ret.replace(quoted(k, quotechar), quoted(v, quotechar))
|
|
return ret
|
|
|
|
|
|
with open(mtdeltas_csv) as csvfile:
|
|
ins = csv.reader(csvfile, delimiter=',', quotechar='"')
|
|
lineI = 0
|
|
for row in ins:
|
|
lineI += 1
|
|
if (len(row) < 2):
|
|
continue
|
|
oldStr = stripQuotes(row[0].strip())
|
|
newStr = stripQuotes(row[1].strip())
|
|
# csv doesn't strip quotes if a space is before an opening quote
|
|
# print("'%s', '%s'" % (oldStr, newStr))
|
|
if len(oldStr) > 0:
|
|
if len(newStr) > 0:
|
|
mtdeltas[oldStr] = newStr
|
|
else:
|
|
print("Skipped empty destination for '" + oldStr
|
|
+ " on line " + str(lineI) + " in " + csvfile)
|
|
|
|
|
|
def oldToNew(path, quotechar='"'):
|
|
newName = path.replace("old", "new")
|
|
if newName == path:
|
|
newName = "new" + newName
|
|
if os.path.exists(newName):
|
|
print("WARNING: Overwriting '%s'..." % newName)
|
|
with open(path, 'r') as ins:
|
|
with open(newName, 'w') as outs:
|
|
oldLine = True
|
|
while oldLine:
|
|
oldLine = ins.readline()
|
|
if oldLine:
|
|
outs.write(replaceQuoted(oldLine, mtdeltas) + "\n")
|
|
print("* wrote '%s'" % newName)
|
|
|
|
|
|
def main():
|
|
for i in range(1, len(sys.argv)):
|
|
try_path = sys.argv[i]
|
|
if os.path.isfile(try_path):
|
|
files.append(try_path)
|
|
else:
|
|
print("MISSING file: '" + try_path + "'")
|
|
return 1
|
|
|
|
if len(files) < 1:
|
|
usage()
|
|
print("")
|
|
print("You must specify a plain-text schem such as a\n"
|
|
".we file, or any file containing double-quoted node names.")
|
|
return 2
|
|
|
|
for oldName in files:
|
|
print("Processing %s..." % oldName)
|
|
oldToNew(oldName)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|
|
|