для цикла через стандартный ввод, используя предыдущий элемент

Я бы изучил использование класса System.TimeZoneInfo, если вы в .NET 3.5. См. http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Это должно учитывать изменения дневного света.

// Coordinated Universal Time string from 
// DateTime.Now.ToUniversalTime().ToString("u");
string date = "2009-02-25 16:13:00Z"; 
// Local .NET timeZone.
DateTime localDateTime = DateTime.Parse(date); 
DateTime utcDateTime = localDateTime.ToUniversalTime();

// ID from: 
// "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone"
// See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);

0
задан Mad Physicist 16 January 2019 в 21:21
поделиться

3 ответа

Ваш код почти у цели. Хотя похвально не хотеть хранить все это в памяти, вам придется хранить совокупные компоненты предыдущей строки:

0
ответ дан Mad Physicist 16 January 2019 в 21:21
поделиться

Я хотел бы сравнить строку с предыдущей, не сохраняя ничего в памяти (без словарей).

Чтобы иметь возможность суммировать подсчеты по всем предыдущим строкам с похожим словом, вам нужно поддерживать некоторое состояние.

Обычно эта работа подходит для awk. Вы можете рассмотреть эту команду:

awk '{a[$1] += $2} p && p != $1{print p, a[p]; delete a[p]} {p = $1} 
END { print p, a[p] }' file

a 2
file 7
for 1
has 1
is 2
lines 1
small 3
test 3
this 3
two 1

Используя delete, это решение не хранит весь файл в памяти. Состояние сохраняется только на время обработки строк с одним и тем же первым словом.

Awk Ссылки:

0
ответ дан anubhava 16 January 2019 в 21:21
поделиться

Основная логика - отслеживать предыдущее слово. Если текущее слово соответствует, накапливать счет. Если нет, напечатайте предыдущее слово и его счет и начните все сначала. Есть небольшой специальный код для обработки первой и последней итераций.

stdin_data = [
    "a   2",
    "file    1",
    "file    2",
    "file    4",
    "for 1",
    "has 1",
    "is  2",
    "lines   1",
    "small   1",
    "small   2",
    "test    1",
    "test    2",
    "this    1",
    "this    2",
    "two 1",
]  

previous_word = ""
word_ct = 0

for line in stdin_data:
    word, count = line.split()
    if word == previous_word:
        word_ct += int(count)
    else:
        if previous_word != "":
            print(previous_word, word_ct)
        previous_word = word
        word_ct = int(count)

# Print the final word and count
print(previous_word, word_ct)

Вывод:

a 2
file 7
for 1
has 1
is 2
lines 1
small 3
test 3
this 3
two 1
0
ответ дан Prune 16 January 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: