Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Задачка в Batch

746  
7495 местный житель29.04.22 20:04
7495
NEW 29.04.22 20:04 

Имеем большой файл инпут.тхт в нем много столбцов, разделитель табулятор,


надо вычитать десятый столбец и сохранить его в отдельный файл оутпут.тхт

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#1 
Murr патриот29.04.22 20:14
Murr
29.04.22 20:14 
в ответ 7495 29.04.22 20:04

Берешь Аксесс или Эксел, импортируешь, селектишь и пишешь...

#2 
7495 местный житель29.04.22 20:28
7495
NEW 29.04.22 20:28 
в ответ Murr 29.04.22 20:14

В Екселе ограничение на объёмы, а Аксесс это база, мне просто пару сточек в баше накидайте, типа такой для замены 1 и 2 столбца:


@echo off & setlocal
set "TXT=Test.txt"
set "CSV=Test.csv"


del "%CSV%" 2>nul
for /f "usebackq tokens=1,2* delims=;" %%i in ("%TXT%") do >>"%CSV%" echo %%j;%%i;%%k
Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#3 
Murr патриот29.04.22 22:43
Murr
NEW 29.04.22 22:43 
в ответ 7495 29.04.22 20:28
there's no for /f in DOS.

Остальное изучаешь тут:


https://superuser.com/questions/1267964/a-cmd-batch-for-f-...

от

Further Resources

и дальше по ссылкам.

#4 
alex445 коренной житель30.04.22 01:01
NEW 30.04.22 01:01 
в ответ Murr 29.04.22 22:43, Последний раз изменено 30.04.22 09:08 (alex445)
Остальное изучаешь тут:


https://superuser.com/questions/1267964/a-cmd-batch-for-f-...
от



Further Resources

и дальше по ссылкам.

Зачем изучать, когда можно просто запихать в какую-нибудь прожку (хоть вышеупомянутый Эксель) и там подшаманить?


Стратегия Алекса "не хочу учиться" работает безотказно, экономит силы и время (ещё бы!) и приводит к лёгким решениям (ну тут как пойдёт). Алекс - твой друг и надёжный товарищь в этом неспокойном мире. Донатить туда-то.


ТС, есть сайт Суперюзер, как уже показывали - там спрашивайте. Тут полтора калеки, из которых один заблудившийся на островах робинзон семизнак - вероятность что-то найти минимальная. Или лучше сразу гуглить по excel. Разбейте задачу на последовательность действий. В вашем случае их будет где-то 2-3. Обычно такие файлы, как у вас, пишутся построчно. Значит, и читать их надо построчно - в каждой строке у вас уже будет элемент нужных вам столбцов:


excel read text file string by string


Затем нужно распарсить строку, выделив столбцы через разделитель-табулятор:


excel split string by tab


Затем нужно распарсенное поместить в какой-то массив и вычесть один элемент из другого (как вы хотели). Ну это уже проще.


Я бы тупо заделал консольное приложение на Сишарпе, т.к. его лучше знаю. Там эта вся фигня делается через LINQ. По сути - тоже гуглить на каждый шаг решение на C#: как открыть файл, как читать по строкам, как парсить, как сохранять в массив и т.д.


По-моему, возня с Экселем более замороченная, чем на Шарпе в консольку вывести после игр с линком.

#5 
7495 местный житель30.04.22 12:30
7495
NEW 30.04.22 12:30 
в ответ alex445 30.04.22 01:01

У меня файл на несколько гигабайтов и миллионы строк, эксель = "OpenOffice Calc" зависает не открывая файла,

хотелось иметь программку либо в батч либо в питоне, можно в С или С++ (но чтоб компилировалось на простой винде)

а так да, если программки не будет, придется рубить через консольную стоку на файлы по 50мб и делать всё ручками..

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#6 
Тупой Американец постоялец30.04.22 12:48
Тупой Американец
NEW 30.04.22 12:48 
в ответ 7495 30.04.22 12:30

Как-то так на Питоне:

import pandas
df = pd.read_csv("input.csv", sep='\t', usecols=['my_column'])
df.to_csv("output.csv", index=False)

Перед этим надо инсталировать pandas: "pip install pandas"

#7 
Murr патриот30.04.22 13:47
Murr
NEW 30.04.22 13:47 
в ответ 7495 30.04.22 12:30

файл на несколько гигабайтов и миллионы строк

------

Если Ексел не справляетсят - пользуется Аксесс.

Писать там ничего не надо... и дистинкт с ордером тоже работают.


и делать всё ручками

------

Дело хозяйское.

Мне проще поднять в базу и выбрать из нее требуемое.

#8 
Murr патриот30.04.22 13:49
Murr
NEW 30.04.22 13:49 
в ответ alex445 30.04.22 01:01

более замороченная

-----

Это тебе кажется... в силу неосведомленности...

#9 
MrSanders коренной житель30.04.22 15:37
NEW 30.04.22 15:37 
в ответ 7495 29.04.22 20:04

awk '{print $10}' input.txt > output.txt


Если мне память не изменят авк табулятор тоже как разделитель понимает.

#10 
alex445 коренной житель30.04.22 16:08
NEW 30.04.22 16:08 
в ответ Murr 30.04.22 13:47, Последний раз изменено 30.04.22 16:32 (alex445)
Мне проще поднять в базу и выбрать из нее требуемое.

Консольная C#-утилитка с батч-процессингом, чтобы по памяти не крашнуться. Даже руками файлы стримить не надо - уже сделали построчное считывание.

#11 
akidervish местный житель30.04.22 22:43
NEW 30.04.22 22:43 
в ответ 7495 29.04.22 20:04, Последний раз изменено 30.04.22 23:23 (akidervish)

python:


import csv

with open('input.txt','r') as file_to_read:
with open('output.txt','w') as file_to_write:

for line in csv.reader(file_to_read, delimiter='\t'):

file_to_write.write(line[9])

file_to_write.write('\n')


P.S.:

табуляция не сохранилась: каждая строка, начиная с первого with сдвинута на 4 символа по отношению к предыдущей (кроме последней) , в соответсвии с питоновским синтаксисом, разумеется

#12 
Срыв покровов патриот01.05.22 00:52
NEW 01.05.22 00:52 
в ответ 7495 29.04.22 20:04

вангую, что такое может PowerShell.

#13 
Бесконечный цикл посетитель01.05.22 20:40
NEW 01.05.22 20:40 
в ответ 7495 29.04.22 20:04

column = [x.split("\t")[10] for x in open('input.txt')]  # Читать
with open("output.txt", "w") as f: f.write("\n".join(column)) # Писать


#14 
7495 местный житель01.05.22 23:24
7495
NEW 01.05.22 23:24 
в ответ Срыв покровов 01.05.22 00:52
вангую, что такое может PowerShell.

С заданиями как у меня, любой язык программирования справится, это простейшие сравнения текста, удаление дубликатов,

поэтому я и обрадовался, как любитель писать в текстовом файле, .тхт убрал и добавил .бат и готово.. но нет, оказывается:


batch это для виндовс,

bash это для линукса

powershell это тоже для виндовс,


и у всех свои заморочки, и ГЛАВНОЕ в batch нормально табулятор оформить не смогли, извращаются, у меня мозг вскипел)))

В общем, сделал всё с питоном (как Американец) , в анаконде, юпитерноутбук панда уже есть, сначала вычитал столбцы:


import pandas as pd


df = pd.read_csv("input.csv", sep='\t', usecols=['recipient'])
df.to_csv("output.csv", index=False)


потом удалил дубликаты:


import pandas as pd

df = pd.read_csv("output.csv", usecols=['recipient'])
df = df.drop_duplicates()
df.to_csv("babosiki.csv", index=False)


в итоге конечный список из 500 тысяч адресов весит 21МБ, теперь надо думать куда деньги потратить, вроде уже все есть)))

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#15 
alex445 коренной житель02.05.22 01:06
NEW 02.05.22 01:06 
в ответ 7495 01.05.22 23:24
куда деньги потратить, вроде уже все есть)))

Дом в Париже Майами?

#16 
BSDLamer Хвостатый Carpal Tunnel02.05.22 01:49
BSDLamer
NEW 02.05.22 01:49 
в ответ MrSanders 30.04.22 15:37
Если мне память не изменят авк табулятор тоже как разделитель понимает.


вроде надо сказать что сепаратор это таб


awk -F '\t' ...

awk {FS="\t"} {print ...} ...

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#17 
akidervish местный житель02.05.22 09:07
NEW 02.05.22 09:07 
в ответ 7495 01.05.22 23:24, Последний раз изменено 02.05.22 09:15 (akidervish)
mport pandas as pd

df = pd.read_csv("input.csv", sep='\t', usecols=['recipient'])
df.to_csv("output.csv", index=False)



Если панда-таблица влезла в РАМ, значит, не такой уж большой файл у вас был...


Решение через итераторы должно сработать даже если не влазит.

#18 
7495 местный житель02.05.22 13:56
7495
NEW 02.05.22 13:56 
в ответ akidervish 02.05.22 09:07

Эксель и OpenOffice Calc у меня зависали, я согласен что построчно читать лучше, но сейчас пока хватает,

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

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#19 
Срыв покровов патриот02.05.22 17:55
NEW 02.05.22 17:55 
в ответ 7495 02.05.22 13:56

в этом и плюс PowerShell - он уже идёт в коробке.

#20