Вот компактный способ сделать это:
static void Main(string[] args)
{
// Read all lines from file
var lines = File.ReadAllLines("Path");
string[] linesToWrite = new string[lines.Length];
for (int i = 0; i < lines.Length; i++)
{
var cells = lines[i].Split('|');
// Appned value in "TotalAcc" column at the end of current line
// and store it in array of lines, that will be written to file
linesToWrite[i] = lines[i] + cells[2];
}
File.WriteAllLines("path", linesToWrite);
}
Ваша структура неприятно неправильна. Вот версия с функцией Посетителя, которая пересекает attrs
подсловари.
def walkDict( aDict, visitor, path=() ):
for k in aDict:
if k == 'attrs':
visitor( path, aDict[k] )
elif type(aDict[k]) != dict:
pass
else:
walkDict( aDict[k], visitor, path+(k,) )
def printMe( path, element ):
print path, element
def filterFor( path, element ):
if element['id'] == '4130-2-2':
print path, element
Вы использовали бы его как это.
walkDict( myDict, filterFor )
Это может быть превращено в генератор вместо Посетителя; это было бы yield path, aDict[k]
вместо того, чтобы вызвать функцию посетителя.
Вы использовали бы его в для цикла.
for path, attrDict in walkDictIter( aDict ):
# process attrDict...
Если Вы хотите решить проблему общим способом, неважно, сколько уровня вложения Вы имеете в своем dict, то создаете рекурсивную функцию, которая пересечет дерево:
def traverse_tree(dictionary, id=None):
for key, value in dictionary.items():
if key == 'id':
if value == id:
print dictionary
else:
traverse_tree(value, id)
return
>>> traverse_tree({1: {'id': 2}, 2: {'id': 3}}, id=2)
{'id': 2}
Этот вид проблемы часто лучше решается с надлежащими определениями классов, не универсальными словарями.
class ProperObject( object ):
"""A proper class definition for each "attr" dictionary."""
def __init__( self, path, attrDict ):
self.path= path
self.__dict__.update( attrDict )
def __str__( self ):
return "path %r, entity %r, hash %r, id %r" % (
self.path, self.entity, self.hash, self.id )
masterDict= {}
def builder( path, element ):
masterDict[path]= ProperObject( path, element )
# Use the Visitor to build ProperObjects for each "attr"
walkDict( myDict, builder )
# Now that we have a simple dictionary of Proper Objects, things are simple
for k,v in masterDict.items():
if v.id == '4130-2-2':
print v
Кроме того, теперь, когда у Вас есть Надлежащие Определения объектов, можно сделать следующее
# Create an "index" of your ProperObjects
import collections
byId= collections.defaultdict(list)
for k in masterDict:
byId[masterDict[k].id].append( masterDict[k] )
# Look up a particular item in the index
print map( str, byId['4130-2-2'] )
Ну, если необходимо сделать это только несколько раз, можно просто использовать вложенный dict.iteritems () для нахождения то, что Вы ищете.
Если Вы запланируете сделать это несколько раз, то действия будут быстро становиться проблемой. В этом случае Вы могли:
измените путь Вы, данные возвращаются Вам к чему-то более подходящему.
если Вы не можете, преобразовать данные однажды муха к dict между идентификатором и ключами (использующий iteritems). Затем используйте его.