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

Берешь Аксесс или Эксел, импортируешь, селектишь и пишешь...
В Екселе ограничение на объёмы, а Аксесс это база, мне просто пару сточек в баше накидайте, типа такой для замены 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

there's no for /f
in DOS.
Остальное изучаешь тут:
https://superuser.com/questions/1267964/a-cmd-batch-for-f-...
от
Further Resources
и дальше по ссылкам.
Остальное изучаешь тут:
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#: как открыть файл, как читать по строкам, как парсить, как сохранять в массив и т.д.
По-моему, возня с Экселем более замороченная, чем на Шарпе в консольку вывести после игр с линком.
У меня файл на несколько гигабайтов и миллионы строк, эксель = "OpenOffice Calc" зависает не открывая файла,
хотелось иметь программку либо в батч либо в питоне, можно в С или С++ (но чтоб компилировалось на простой винде)
а так да, если программки не будет, придется рубить через консольную стоку на файлы по 50мб и делать всё ручками..

Как-то так на Питоне:
import pandas
df = pd.read_csv("input.csv", sep='\t', usecols=['my_column'])
df.to_csv("output.csv", index=False)
Перед этим надо инсталировать pandas: "pip install pandas"
файл на несколько гигабайтов и миллионы строк
------
Если Ексел не справляетсят - пользуется Аксесс.
Писать там ничего не надо... и дистинкт с ордером тоже работают.
и делать всё ручками
------
Дело хозяйское.
Мне проще поднять в базу и выбрать из нее требуемое.
awk '{print $10}' input.txt > output.txt
Если мне память не изменят авк табулятор тоже как разделитель понимает.
Мне проще поднять в базу и выбрать из нее требуемое.
Консольная C#-утилитка с батч-процессингом, чтобы по памяти не крашнуться. Даже руками файлы стримить не надо - уже сделали построчное считывание.
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 символа по отношению к предыдущей (кроме последней) , в соответсвии с питоновским синтаксисом, разумеется
column = [x.split("\t")[10] for x in open('input.txt')] # Читать
with open("output.txt", "w") as f: f.write("\n".join(column)) # Писать
вангую, что такое может 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 pddf = pd.read_csv("output.csv", usecols=['recipient'])df = df.drop_duplicates()df.to_csv("babosiki.csv", index=False)
в итоге конечный список из 500 тысяч адресов весит 21МБ, теперь надо думать куда деньги потратить, вроде уже все есть)))

Если мне память не изменят авк табулятор тоже как разделитель понимает.
вроде надо сказать что сепаратор это таб
awk -F '\t' ...
awk {FS="\t"} {print ...} ...
mport pandas as pd
df = pd.read_csv("input.csv", sep='\t', usecols=['recipient'])
df.to_csv("output.csv", index=False)
Если панда-таблица влезла в РАМ, значит, не такой уж большой файл у вас был...
Решение через итераторы должно сработать даже если не влазит.
Эксель и OpenOffice Calc у меня зависали, я согласен что построчно читать лучше, но сейчас пока хватает,
а если расширять поиск, то конечно и с базой данных работать придётся и инсталлировать кучу программ..
