Для показа примера того, что описывали другие:
SELECT
Col1, -- All of the columns you want to dedupe on
Col2, -- which is not neccesarily all of the columns
Col3, -- in the table
Col4,
Col5,
Col6,
Col7,
Col8,
Col9,
Col10
FROM
MyTable
GROUP BY
Col1,
Col2,
Col3,
Col4,
Col5,
Col6,
Col7,
Col8,
Col9,
Col10
HAVING
COUNT(*) > 1
Я бы не стал использовать для этого PaddedForm
. На самом деле, я не уверен, что PaddedForm
годится для чего-либо. Вместо этого я бы использовал старый добрый ToString
, Символы
и PadLeft
, например:
toFixedWidth[n_Integer, width_Integer] :=
StringJoin[PadLeft[Characters[ToString[n]], width, "0"]]
Затем вы можете использовать StringForm
и ToString
для создания имени файла:
toNumberedFileName[n_Integer] :=
ToString@StringForm["filename_``", toFixedWidth[n, 5]]
Mathematica не очень хорошо подходит для такого рода перестановки строк.
ИЗМЕНИТЬ, чтобы добавить: Собственно Mathematica не имеет необходимой функциональности, но класс java.lang.String
имеет статический метод format ()
, который принимает аргументы в стиле printf
. Вы можете легко вызвать его, используя функциональность JLink в системе Mathematica. Спектакль будет не очень, но для многих случаев использования вам это будет безразлично:
Needs["JLink`"];
LoadJavaClass["java.lang.String"];
LoadJavaClass["java.util.Locale"];
sprintf[fmt_, args___] :=
String`format[Locale`ENGLISH,fmt,
MakeJavaObject /@
Replace[{args},
{x_?NumericQ :> N@x,
x : (_Real | _Integer | True |
False | _String | _?JavaObjectQ) :> x,
x_ :> MakeJavaExpr[x]},
{1}]]
Вам нужно проделать немного больше работы, потому что JLink немного тупит в отношении функций Java с переменным числом аргументов. Метод format ()
принимает строку формата и массив объектов Java Object
, и Mathematica не будет выполнять преобразование автоматически, что и является тем, что MakeJavaObject
есть для.
Я согласен с Пилси.
Вот как я бы сделал это. сделайте это.
Обратите внимание на удобную функцию cat
, которую я считаю чем-то вроде sprintf (без заполнителей, таких как StringForm), поскольку она работает как Print (вы можете распечатать любое объединение выражений без преобразования в String), но генерирует строку вместо отправки в стандартный вывод.
cat = StringJoin@@(ToString/@{##})&;
pad[x_, n_] := If[StringLength@cat[x]>=n, cat[x],
cat@@PadLeft[Characters@cat[x],n,"0"]]
cat["filename_", pad[#, 5]]&
Это очень похоже на ответ Пилси, но я думаю, что cat
делает его немного чище.
Кроме того, я думаю, что безопаснее иметь это условие в функции pad - лучше иметь заполнение неправильное, чем неправильное число.